スレッド内でメモリが足りなくなったときの怖い話

こんな感じのプログラムを実行すると、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();
}