2013-04-21 12 views
17

Questo test dimostra il numero massimo di thread che può essere creato in JavaPerché il numero massimo di thread diminuisce quando aumento la dimensione massima dell'heap?

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); 
     } 
    } 

Quando eseguo con dimensione predefinita heap (256M) ottengo

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) 

quando ho aumentare dimensione heap massima di 512M ottengo

Max memory 494M 
Max threads 1906 
... 

quando ho aumentare la dimensione massima heap 1024M ricevo

Max memory 989M 
Max threads 1162 
... 

Cioè, più memoria heap meno thread. Perché?

+0

Potremmo vedere il tuo 'java -version'? – NPE

+0

È Client HotSpot (TM) VM 1.7.0_21 su Windows 7 –

+0

Ulteriori thread = meno heap –

risposta

18

Ogni thread richiede una pila. Maggiore è la quantità di memoria allocata nell'heap, minore è la memoria disponibile per gli stack.

Questo sarà particolarmente acuto se si utilizza una JVM a 32 bit, poiché il processo non avrà più di 4 GB di spazio di indirizzamento per tutto (il codice, l'heap, gli stack ecc.). Non riesco a riprodurre questo comportamento sul mio box a 64 bit, dove "Max threads" rimane lo stesso indipendentemente dalla quantità di memoria allocata all'heap.

Vale la pena notare che molti sistemi operativi consentono di modificare le dimensioni dello stack. Su Unix questo viene fatto usando ulimit -s.

+0

Avete qualche fonte? Inoltre è possibile specificare le dimensioni dello stack (totale o per thread)? –

0

Suppongo che l'aumento della dimensione dell'heap (e l'utilizzo di tutto) riduca la quantità di memoria disponibile per la creazione di nuovi thread, quindi non è possibile creare tanti thread come prima.

Problemi correlati