2013-06-13 13 views
5

Ausführen dieses CodesOS X Java maximale Threads pro Prozess

 for (int i = 0; i < 4000; i++) { 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         Thread.sleep(60000); 
        } catch (InterruptedException e) { 
        } 
       } 
      }).start(); 
      System.out.println(i); 
     } 

Ergebnisse in

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:658) 
    at com.codeoverdrive.burnbearburn.Main.main(Main.java:10) 

nach 2024 laufenden Threads. Das Spielen mit JVM-Heap- und Stack-Größen hilft nicht.

sysctl kern.num_threads 

kehrt

kern.num_threads: 10240 

OS X Mountain Lion 10.8.4, Macbook Air mit 4 GB RAM

Irgendwelche Vorschläge?

+0

Übrigens kann man 'TimeUnit.MINUTES.sleep (1);' – fge

+0

@fge erhöhen Permgen hilft nicht, weil es für Klassendefinitionen und zugehörige Metadaten verwendet wird. – mixel

Antwort

2

Die wahrscheinlichste Ursache ist, dass für den Benutzer, mit dem Sie arbeiten, die Anzahl der erstellten Threads begrenzt ist.

Versuchen Sie, dieses Limit zu erhöhen. Das aktuelle Limit kann mit dem Befehl ulimit -u angezeigt werden. Beachten Sie, dass Sie als regulärer Benutzer wahrscheinlich nicht in der Lage sind, den Wert zu erhöhen. Sie müssen die Umgebung als root ändern.

Und ja, OutOfMemoryError ist in diesem Fall irreführend.

+0

'ulimit -u' zeigt die Anzahl der max. Benutzerprozesse an, nicht die Threads. Und ich weiß nicht warum, aber die Einstellung ändert nichts an seinem Wert. – mixel

+0

Es beeinflusst auch die Anzahl der Threads! Zumindest unter Linux tut es das. Und ja, es ist normal, dass Sie es nicht als Benutzer ändern können. – fge

+0

Ich versuchte als root. – mixel