2013-04-21 2 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) 

를 얻을 그것을 실행하면 자바

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

에서 만들 수있는 스레드의 최대 수를 표시 내가 1024M에 최대 힙 크기를 증가시킬 때 512M은 내가

을 얻을
Max memory 494M 
Max threads 1906 
... 

를 얻을 수
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가 새 스레드를 만들 때 사용할 수있는 메모리 양이 줄어들어 이전만큼 많은 스레드를 만들 수 없다고 생각됩니다.

관련 문제