すべてのオブジェクトがヒープメモリを必要とし、スタック上のすべてのプリミティブ/リファレンスがスタックメモリを必要とすることを知っています。
ヒープ上にオブジェクトを作成しようとしたときにメモリ不足が発生すると、JVMはヒープ上にjava.lang.OutOfMemoryErrorを作成し、それをスローします。
つまり、暗黙的に、これは起動時にJVMによって予約されたメモリがあることを意味します。
この予約メモリが使い果たされるとどうなるでしょう(間違いなく使い果たされます。以下の説明をお読みください)。java.lang.OutOfMemoryErrorのインスタンスを作成するのに十分なメモリがJVMにヒープにない場合はどうなりますか?
ぶら下がっているだけですか?または、OOMのインスタンスにnull
メモリがないため、彼は私を投げますnew
か?
try {
Object o = new Object();
// and operations which require memory (well.. that's like everything)
} catch (java.lang.OutOfMemoryError e) {
// JVM had insufficient memory to create an instance of java.lang.OutOfMemoryError to throw to us
// what next? hangs here, stuck forever?
// or would the machine decide to throw us a "null" ? (since it doesn't have memory to throw us anything more useful than a null)
e.printStackTrace(); // e.printStackTrace() requires memory too.. =X
}
==
JVMが十分なメモリを予約できないのはなぜですか?
予約されているメモリの量に関係なく、JVMにそのメモリを「再利用」する方法がない場合は、そのメモリが使い果たされる可能性があります。
try {
Object o = new Object();
} catch (java.lang.OutOfMemoryError e) {
// JVM had 100 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
// JVM had 99 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e3) {
// JVM had 98 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e4) {
// JVM had 97 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e5) {
// JVM had 96 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e6) {
// JVM had 95 units of "spare memory". 1 is used to create this OOM.
e.printStackTrace();
//........the JVM can't have infinite reserved memory, he's going to run out in the end
}
}
}
}
}
}
またはもっと簡潔に:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
から、大きなバッファーの作成を伴う何かを行うために使用しました...
OutOfMemoryError
それへの参照を保持している場合にのみ発生する可能性があります。OutOfMemoryError
あなたがそれをキャッチすることであなたのプログラムの状態についてほとんど何も保証することができないので、それをキャッチすることは人が考えるほど有用ではないことを思い出させます。stackoverflow.com/questions/8728866/…を