こんな感じのプログラムを実行すると、OutOfMemoryError出ますね。
public static void main(String[] args) { List<List> l = new ArrayList(); for(;;) l.add(new ArrayList()); }
ところが、こんな感じでスレッドに入れてあげると、静かに終了します。
public static void main(String[] args) { final List<List> l = new ArrayList(); new Thread(){ public void run(){ for(;;) l.add(new ArrayList()); } }.start(); }
スレッドが落ちてる!
あ、1.6.0-b105 + Windows XPです。
ウィンドウを表示しておくと、そっちはそのままなので、VMが落ちてるわけではありません。
Listの変数をスレッド内のローカル変数として定義すると、OutOfMemoryError出ます。
public static void main(String[] args) { new Thread(){ public void run(){ List<List> l = new ArrayList(); for(;;) l.add(new ArrayList()); } }.start(); }
Listをスレッドオブジェクトのフィールドで定義すると、静かに終了します。
public static void main(String[] args) { new Thread(){ List<List> l; public void run(){ l = new ArrayList(); for(;;) l.add(new ArrayList()); } }.start(); }