McGoverneatheory는 StackoverFlow 에서이 질문을했습니다.
Java 가상 기계는 최대 몇 개의 스레드를 지원합니까? 가상 기계 개발자와 관련이 있습니까? 운영 체제는 어떻습니까? 다른 요인이 있습니까?
에디의 대답 :
사용중인 CPU, 운영 체제, 다른 프로세스가 수행하는 작업, 사용중인 Java 버전 및 기타 요인에 따라 다릅니다. 6500 개가 넘는 스레드가 내려 가기 전에 Windows 서버를 보았습니다. 물론 대부분의 스레드는 아무것도하지 않습니다. 기계에 거의 6500 개의 스레드 (Java)가 있으면 기계에 문제가 발생하여 불안정 해집니다.
내 경험상 JVM에 포함 된 스레드는 컴퓨터 자체의 성능과 양의 상관 관계가 있습니다.
물론, 각 스레드에 스택 (가상 기계 스택)을 가질 수 있고 원하는대로 할 수 있도록 충분한 기본 메모리가 있고 Java에 충분한 메모리를 할당해야합니다. 최신 CPU (AMD 또는 Intel의 최근 세대)와 1-2G 메모리 (운영 체제에 따라)가있는 모든 기계는 수천 개의 스레드가있는 Java 가상 머신을 쉽게 지원할 수 있습니다.
보다 정확한 답변이 필요한 경우 스트레스 테스트를 직접 테스트하는 것이 가장 좋습니다.
찰리 마틴의 대답 :
많은 매개 변수가 있습니다 (설정할 수 있음). 특정 가상 머신의 경우 고유 한 런타임 매개 변수가 있습니다. (최대 스레드 수) 어느 정도까지는 운영 체제에 의해 결정됩니다. 기본 운영 체제가 스레드에 어떤 지원을 제공해야합니까? 어떤 제한이 부과됩니까? 가상 기계는 기본 운영 체제의 스레드 또는 빨간색 스레드 또는 녹색 스레드를 사용합니까?
운영 체제가 제공하는 지원은 또 다른 문제입니다. 다음과 같은 Java 프로그램을 작성하는 경우 :
코드 사본은 다음과 같습니다.
클래스 Dielikeadog {
public static void main (String [] argv) {
을 위한(;;){
새 스레드 (new somerunaable) .start ();
}
}
}
(구문 세부 사항에 대해 불평하지 마십시오. 이것은 막 시작되었습니다) 물론 수백 개의 실행 스레드를 얻고 싶습니다. 그러나 스레드 생성 비용은 비교적 높으며 (너무 많은 스레드) 일정의 오버 헤드가 두드러집니다. 이 스레드가 유용한 일을 할 수 있는지는 여전히 확실하지 않습니다.
업그레이드 된 버전
좋아, 기다릴 수 없어! 다음은 약간 연마 된 소규모 테스트 프로그램입니다.
다음과 같이 코드를 복사하십시오 : Public Class DielikeAdog {
개인 정적 객체 S = new Object ();
개인 정적 int count = 0;
public static void main (String [] argv) {
을 위한(;;){
새 스레드 (new runnable () {
public void run () {
동기화 된 {
count += 1;
System.err.println ( "New Thread #"+count);
}
을 위한(;;){
노력하다 {
Thread.sleep (1000);
} catch (예외 e) {
System.err.println (e);
}
}
}
}).시작();
}
}
}
인텔의 OS/X 10.5.6 시스템에서 Java 5의 출력은 다음과 같습니다.
코드 사본은 다음과 같습니다.
새로운 스레드 #2547
새로운 스레드 #2548
새로운 스레드 #2549
스레드를 만들 수 없습니다 : 5
새 스레드 #2550
스레드의 예외 "main"java.lang.outofMemoryError : 새로운 기본 스레드를 만들 수 없습니다.
at java.lang.thread.start0 (기본 방법)
at java.lang.thread.start (Thread.java:592)
dielikeadog.main에서 (Dielikeadog.java:6)
Benjismith의 답변 :
Charlie Martin의 답변을 읽은 후, 힙 메모리의 크기가 생성 된 스레드 수를 차이를 만들 수 있는지 궁금해하고 결과에 기절했습니다. JDK 1.6.0_11을 사용하여 Vista Home Premium SP1 시스템에서. Charlie의 테스트 프로그램을 실행하려면 힙 메모리의 크기를 2m에서 1024m로 설정하십시오. 예를 들어 : 2m 힙 메모리를 만들려면 사용하는 가상 머신 매개 변수는 다음과 같습니다. -xms2m -xmx2m.
내 테스트 결과는 다음과 같습니다.
코드를 다음과 같이 복사하십시오. 2 MB-> 5744 스레드
4 MB-> 5743 스레드
8 MB-> 5735 스레드
12 MB-> 5724 스레드
16 MB-> 5712 스레드
24 MB-> 5687 스레드
32 MB-> 5662 스레드
48 MB-> 5610 스레드
64 MB-> 5561 스레드
96 MB-> 5457 스레드
128 MB-> 5357 스레드
192 MB-> 5190 스레드
256 MB-> 5014 스레드
384 MB-> 4606 스레드
512 MB-> 4202 스레드
768 MB-> 3388 스레드
1024 MB-> 2583 스레드
따라서 힙의 크기는 정말 중요합니다. 그러나 힙 크기와 최대 스레드 수는 반비례합니다.
이것은 너무 이상합니다!
Neil Coffey의 답변 :
절대 이론적 최대 스레드 수는 프로세스의 사용자 주소 공간을 스레드 스택의 크기로 나눈 값입니다 (실제로 모든 메모리가 스레드 스택에서 사용하는 경우 실행할 수있는 프로그램이 없습니다). 따라서 32 비트 Windows 시스템을 예로 들어 보면 각 프로세스의 사용자 주소 공간은 2G입니다. . 실제로 XP 시스템에서는 약 13,000 개의 스레드가 시작될 수 있음을 발견했습니다.
그런 다음 귀하의 질문은 본질적으로 다음과 같이 생각합니다. (a) 코드의 많은 스레드를 효과적으로 관리 할 수 있는지 여부는 분명히 어리석은 일입니다 (예 : 동일한 객체 객체에 올리게하십시오 (b) 운영 체제가 할 수 있는지 여부 이 많은 스레드를 효과적으로 관리하십시오. 기본적으로 (a)의 대답이 "예"인 경우 답변 (b)의 대답은 "예"입니다.
우연히도 스레드 생성자에서 스레드 스택 크기를 설정할 수 있지만이를 가상 머신 매개 변수와 혼동 할 필요는 없으며 혼동해서는 안됩니다.