2011-07-24 7 views
0

これは、マシンがjava.lang.OutOfMemoryErrorをスローする前に最大のスレッド数に対して作成者がテストしているこのblog siteに遭遇しました。しかし、私の下のテストコードでは、任意の大きなスレッドが生成されたにもかかわらずエラーにヒットすることはできません。スレッドを生成してjava.lang.OutOfMemoryErrorを実行するにはどうすればよいですか?

Thread t = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      while (!Thread.interrupted()) { 
       Thread.sleep(1000); 
      } 
     } catch (InterruptedException ignored) { 
      // 
     } 
    } 
}); 
+0

スレッド数はOSによって制限されていませんか? AFAIK、Windowsでは約2000スレッドしか作成できません。 –

答えて

8

、スレッド内で寝て試してみてくださいそれ以外の場合は、あまりにも早く終わるとゴミ収集を得る可能性がありますスレッドに割り当てられたメモリが解放されます。空きメモリの割合がスレッドの発生率より大きい場合、OutOfMemoryErrorは決して得られません。次の例のように、長い時間のためにCar実行を行うことであることを防ぐことができます。

class Car implements Runnable { 
    public void run() { 
     Thread.sleep(10000000); 
    } 
} 
+0

このようなプログラムをプロファイリングすると、利用可能なヒープとパーマネントメモリが十分にあることがわかりますが、 'java.lang.OutOfMemoryError:新しいネイティブスレッドを作成できません。 '実際、ヒープやパーマネントメモリの量が増えると、作成できるスレッドの量が減り、マシン上で3231スレッドの最大値に '-Xmx5m -XX:MaxPermSize = 5m'を打つことができました。したがって、スレッドを作成するのは問題ではなく、OSの限界です。ネイティブスレッドの場合は –

+0

です。このような場合にjvmが緑のスレッドを使用することを禁止するものはありません –

+0

@tulskiy 32ビットJVMを使用している場合、実際にどれくらいのメモリを持っているかにかかわらず、アドレス指定可能なメモリは限られています。空きアドレス空間が増えるほど、スレッド数は増えます。他のものに取り込まれるメモリが多いほど、スレッド数は少なくなります。より多くのスレッドを取得するには、ブログで提案されているように、スレッドごとのスタックサイズを減らしてみてください。 '-XX:ThreadStackSize = 64' –

1

(Runnableを)Carインスタンスが開始された直後に終了した場合:example codeに示すよう

for (int i = 0; i < 1000000; i++) { 
     Thread thread = new Thread(new Car()); 
     thread.setName(Integer.toString(i)); 
     thread.start(); 
    } 
1

またここでJavaSpecialistsニュースレター#で149 http://www.javaspecialists.eu/archive/Issue149.html

を覆われている同じ問題を見てみる小さいです

import java.util.concurrent.atomic.AtomicInteger; 
import java.util.concurrent.CountDownLatch; 

public class ThreadCreationTest { 
    public static void main(String[] args) 
     throws InterruptedException { 
    final AtomicInteger threads_created = new AtomicInteger(0); 
    while (true) { 
     final CountDownLatch latch = new CountDownLatch(1); 
     new Thread() { 
     { start(); } 
     public void run() { 
      latch.countDown(); 
      synchronized (this) { 
      System.out.println("threads created: " + 
       threads_created.incrementAndGet()); 
      try { 
       wait(); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
      } 
     } 
     }; 
     latch.await(); 
    } 
    } 
} 
+0

これを試して、ありがとう! –

関連する問題