私はこのプログラムは、ブロックをキャッチするために行かない(ヒープがいっぱいになると、私は理由を理解したい)なぜそれをキャッチしようとしている間にOOMEの動作が異なるのですか?
public class OOME_NotCatch {
static List l = new ArrayList();
static Long i = new Long(1);
public static void main(String[] args) {
try {
while (true) {
l.add(i);
i++;
}
} catch (OutOfMemoryError e) {
e.printStackTrace();
System.out.println("Encountered OutOfMemoryError");
}
}
}
//Console : Exception in thread "main"
をしかし、プログラムの下の後でも、良い走る専門家
あなたからいくつかの理解を必要としますOOMEを取得する:
public class Catch_OOME_Collection {
static List l = new ArrayList();
public static void main(String[] args) {
try {
while (true) {
l.add(new byte[1000000]);
System.out.println("size " + l.size());
}
} catch (OutOfMemoryError e) {
System.out.println("Encountered OutOfMemoryError");
e.printStackTrace();
System.out.println("size of list is " + l.size());
Iterator i = l.iterator();
while(i.hasNext()){
System.out.println(i.next().toString());
i.remove();
}
while (true) {
System.out.println("keep printing");
}
}
}
}
私は同じエラーOOMEの異なる結果を見た後、少し混乱しています。してください。
私は最初のプログラムの分析を理解していません。例外ハンドラが私のために実行されることに加えて、JVMは基本的にどのメモリも全く割り当てられない状態で、どのように起動することができますか? sysoutがフラッシュされる前にJVMがシャットダウンしていて、syserrを使用するとOPの結果が異なる可能性が高いことがわかります。 –
JVMは、catchブロック内の命令を実行するためにメモリを割り当てる必要があります(スタックトレースを出力するなど)。したがって、JVMは終了します。要するに、私の答えはJoniの答えと似ていますが、第2のプログラムがJVMに利用可能なメモリを残すのはなぜですか? –
さて、それは新しい「Long」を割り当てることと何が関係していますか? –