2013-06-13 14 views
5

uruchomiony ten kodOS X Java maksymalne nici na proces

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

wyników w

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) 

po 2024 uruchomionych wątków. Granie przy użyciu sterty JVM i rozmiarów stosów nie pomaga.

sysctl kern.num_threads 

powraca

kern.num_threads: 10240 

OS X Mountain Lion 10.8.4, MacBook Air z 4GB pamięci RAM

jakieś sugestie?

+0

Przy okazji można 'TimeUnit.MINUTES.sleep (1);' – fge

+0

@ fge increase permgen nie pomaga, ponieważ jest używany do definicji klas i powiązanych metadanych. – mixel

Odpowiedz

2

Najbardziej prawdopodobną przyczyną jest to, że użytkownik, z którym korzystasz, ma limit liczby wątków, które może utworzyć.

Spróbuj zwiększyć ten limit. Bieżący limit można wyświetlić za pomocą polecenia ulimit -u. Zauważ, że jako zwykły użytkownik prawdopodobnie nie będziesz w stanie go zwiększyć, będziesz musiał zmodyfikować środowisko jako root.

I tak, OutOfMemoryError wprowadza w tym przypadku w błąd.

+0

'ulimit -u' pokazuje maksymalną liczbę procesów użytkowników, a nie wątki. I nie wiem dlaczego, ale ustawienie go nie zmienia jego wartości. – mixel

+0

Wpływa również na liczbę wątków! Przynajmniej w Linuksie tak. I tak, to normalne, że nie możesz tego zmienić jako użytkownik. – fge

+0

Próbowałem jako root. – mixel