2013-04-21 66 views
17

このテストでは、私は、デフォルトのヒープサイズ(256M)私はへの最大ヒープサイズを増やしたときに、私は最大ヒープサイズを大きくすると、スレッドの最大数が減少するのはなぜですか?

Max memory 247M 
Max threads 2247 
java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:691) 
    at test.Test1.main(Test1.java:19) 

を取得し、それを実行すると、Javaの

System.out.println("Max memory " + Runtime.getRuntime().maxMemory()/1024/1024 + "M"); 
    for (int i = 0;; i++) { 
     Thread t = new Thread() { 
      public void run() { 
       try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
       } 
      }; 
     }; 
     try { 
      t.start(); 
     } catch (Error e) { 
      System.out.println("Max threads " + i); 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

に作成できるスレッドの最大数を示します512M私は

Max memory 494M 
Max threads 1906 
... 

私は1024Mに最大ヒープサイズを増やしたときに、私は

取得を取得
Max memory 989M 
Max threads 1162 
... 

つまり、より多くのヒープメモリが少ないスレッドです。何故ですか?

+0

あなたの 'java -version'を見ることができますか? – NPE

+0

Windows 7上のHotSpot(TM)クライアントVM 1.7.0_21です –

+0

スレッド数が多い=ヒープの数が少ない –

答えて

18

各スレッドにはスタックが必要です。ヒープに割り当てるメモリが増えるほど、スタックのメモリが少なくなります。

これは、すべてのコードで(コード、ヒープ、スタックなど)のために4GBを超えるアドレススペースしか持たないため、32ビットJVMを使用している場合には特に重要です。私はヒープに割り当てるメモリの量に関係なく "最大スレッド"が同じままである私の64ビットボックスでこの動作を再現することはできません。

多くのオペレーティングシステムでは、スタックのサイズを調整することができます。 Unixでは、これはulimit -sを使って行われます。

+0

ソースはありますか?また、スタックのサイズを指定することも可能です(合計またはスレッドごと)。 –

0

ヒープサイズを増やす(そしてそのすべてを使用する)と、OSが新しいスレッドを作成するために使用できるメモリの量が少なくなるため、以前と同じ数のスレッドを作成することはできません。

関連する問題