Java 가상 머신이 최대 몇 개의 스레드를 지원하는지에 대한 연구

McGovernTheory는 StackOverflow에서 다음과 같은 질문을 했습니다.
Java VM은 최대 몇 개의 스레드를 지원합니까?가상 머신 개발 업체와 관련이 있습니까?운영체제랑요?또 다른 요소가 있나요?
Eddie의 답변:
이것은 당신이 사용하는 CPU, 운영체제, 다른 프로세스가 하고 있는 일, 당신이 사용하는 자바의 버전, 그리고 다른 요소에 달려 있습니다.Windows 서버가 다운되기 전에 6500개 이상의 스레드가 있는 것을 본 적이 있습니다.물론 대다수의 노선은 아무 일도 하지 않았다.일단 한 대의 기계에 6500개의 스레드(Java 안)가 모자라면 기계에 문제가 생기기 시작하고 불안정해진다.
제 경험에 의하면 JVM이 수용하는 스레드는 컴퓨터 자체의 성능과 상관이 있습니다.
물론, 당신은 충분한 본체 메모리를 가지고 자바에 충분한 메모리를 분배하여 모든 라인에 창고(가상 창고)를 가지고 하고 싶은 일을 할 수 있도록 해야 합니다.최신 CPU (AMD 또는 Intel의 최근 세대) 와 1-2G 메모리 (운영 체제에 따라 다름) 를 보유한 모든 기기는 수천 개의 스레드가 있는 Java 가상 머신을 쉽게 지원할 수 있다.
만약 네가 더욱 정확한 답안을 필요로 한다면, 가장 좋은 것은 스스로 압력 측정을 하는 것이다.
Charlie Martin의 대답:
여기에 많은 매개 변수가 있습니다. (설정할 수 있습니다.)특정 가상 시스템의 경우 자체 런타임 매개 변수가 있습니다.(최대 스레드 수) 어느 정도에 운영체제에 의해 결정된다. 밑바닥의 운영체제는 스레드에 어떤 지원을 제공해야 합니까?어떤 제한을 가합니까?가상 기기는 원래 운영체제의 라인을 사용합니까, 아니면 레드스레드나 그린스레드를 사용합니까?
운영체제가 제공하는 지원은 또 다른 문제다.아래에 Java 프로그램을 이렇게 쓰면:

class DieLikeADog {
      public static void main(String[] argv){
          for(;;){
             new Thread(new SomeRunaable).start();
          }
      }
 }
(문법의 세부 사항을 원망하지 마라. 이제 막 시작된 것이다) 그러면 너는 당연히 수백 수천 개의 운행 라인을 얻을 수 있기를 바란다.그러나 하나의 라인을 만드는 비용은 상대적으로 크고 스케줄링 비용이 두드러진다.이 라인들이 유용한 일을 할 수 있을지는 아직 확실하지 않다.
업그레이드 버전
됐어, 지체할 수 없어!다음은 저의 윤색을 조금 넣은 작은 테스트 프로그램입니다
public class DieLikeADog {
    private static Object s = new Object();
    private static int count = 0;
    public static void main(String[] argv){
        for(;;){
            new Thread(new Runnable(){
                    public void run(){
                        synchronized(s){
                            count += 1;
                            System.err.println("New thread #"+count);
                        }
                        for(;;){
                            try {
                                Thread.sleep(1000);
                            } catch (Exception e){
                                System.err.println(e);
                            }
                        }
                    }
                }).start();
        }
    }
}
Intel의 OS/X 10.5.6 시스템에서 Java 5의 출력은 다음과 같습니다

New thread #2547
New thread #2548
New thread #2549
Can't create thread: 5
New thread #2550
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:592)
        at DieLikeADog.main(DieLikeADog.java:6)
benjismith의 대답:
Charlie Martin의 답변을 읽고 메모리 크기가 생성된 스레드 수에 따라 달라질 수 있는지 궁금했습니다. 그리고 결과에 놀랐습니다. Vista Home Premium SP1 시스템에서 JDK 1.6.0_11, 메모리의 크기를 2M에서 1024M로 설정하여 Charlie의 테스트 프로그램을 실행합니다.예를 들어 2M의 메모리 더미를 만들 때 내가 사용하는 가상 기기의 매개 변수는 -Xms2m-Xmx2m이다.
다음은 저의 테스트 결과입니다
2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads
그래서 더미의 크기가 확실히 중요하다.그러나 무더기 크기와 최대 스레드 수는 반비례 관계를 보인다.이것은 너무 기괴하다!
Neil Coffey의 대답:
절대 이론상의 최대 스레드 수는 프로세스의 사용자 주소 공간을 스레드 창고의 크기로 나누는 것이다. (현실적으로 메모리를 모두 스레드 창고에 사용하면 실행할 수 있는 프로그램이 없을 것이다.)따라서 32비트 Windows 시스템의 경우 각 프로세스의 사용자 주소 공간은 2G이며 각 스레드 스택의 크기가 128K이면 최대 16384(=2*1024*1024/128)의 스레드가 있습니다.실제로 XP 시스템에서 나는 대략 13000개의 스레드를 시작할 수 있다는 것을 발견했다.
그리고 나는 당신의 문제는 본질적으로 (a) 코드에서 많은 라인을 효과적으로 관리할 수 있는지, 그들이 어리석은 일을 하지 못하게 할 수 있는지, (예를 들어 같은object 대상에서 나중에 notifyAll ()...), (b) 운영체제가 이 많은 라인을 효과적으로 관리할 수 있는지의 여부라고 생각한다.기본적으로 (a)의 답이'yes'라면 (b)의 답도'yes'다.
공교롭게도Thread의 구조 함수에 스레드 창고의 크기를 설정할 수 있지만, 이것과 가상 기기 파라미터를 혼동해서는 안 된다.

좋은 웹페이지 즐겨찾기