답변:
이것은 사용중인 CPU, OS, 다른 프로세스가 수행중인 작업, 사용중인 Java 릴리스 및 기타 요인에 따라 다릅니다. 컴퓨터를 종료하기 전에 Windows 서버에> 6500 스레드가있는 것을 보았습니다. 물론 대부분의 스레드는 아무것도하지 않았습니다. 기계가 약 6500 스레드 (Java에서)에 도달하면 전체 기계에 문제가 발생하여 불안정 해졌습니다.
내 경험에 따르면 Java (최신 버전)는 컴퓨터 자체가 문제없이 호스팅 할 수있는만큼 많은 스레드를 행복하게 사용할 수 있습니다.
물론 충분한 RAM이 있어야하며 스레드가 수행하는 모든 작업을 수행하고 각 스레드에 대한 스택을 갖기 위해 충분한 메모리로 Java를 시작해야합니다. 최신 CPU (가장 최근 몇 세대의 AMD 또는 Intel) 및 1-2 기가 메모리 (OS에 따라 다름)가있는 모든 시스템은 수천 개의 스레드가 있는 JVM을 쉽게 지원할 수 있습니다 .
이보다 더 구체적인 답변이 필요한 경우 가장 좋은 방법은 프로파일 링하는 것입니다.
음.
여기에는 몇 가지 매개 변수가 있습니다. 특정 VM뿐만 아니라 일반적으로 VM에 런타임 매개 변수도 있습니다. 그것은 운영 체제에 의해 다소 좌우됩니다. 기본 OS는 스레드에 대해 어떤 지원을 제공하며 스레드에 어떤 제한이 있습니까? VM이 실제로 OS 수준 스레드를 사용하는 경우 오래된 빨간색 스레드 / 녹색 스레드가 좋습니다.
"지원"의 의미는 또 다른 질문입니다. 다음과 같은 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 6 5 (주석 참조)에서 얻을 수있는 내용은 다음과 같습니다.
새 스레드 # 2547 새 스레드 # 2548 새 스레드 # 2549 스레드를 만들 수 없습니다 : 5 새 실 # 2550 "main"스레드 예외 java.lang.OutOfMemoryError : 새 기본 스레드를 작성할 수 없습니다 java.lang.Thread.start0 (기본 메소드) java.lang.Thread.start (Thread.java:592)에서 DieLikeADog.main (DieLikeADog.java:6)에서
Charlie Martin의 게시물을 읽은 후 힙 크기가 만들 수있는 스레드 수에 차이가 있는지 궁금해했으며 결과에 완전히 혼란 스러웠습니다.
Vista Home Premium SP1에서 JDK 1.6.0_11을 사용하여 2MB에서 1024MB 사이의 다양한 힙 크기로 Charlie의 테스트 응용 프로그램을 실행했습니다.
예를 들어, 2MB 힙을 작성하려면 인수 -Xms2m -Xmx2m으로 JVM을 호출합니다.
내 결과는 다음과 같습니다.
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
예, 힙 크기가 중요합니다. 그러나 힙 크기와 최대 스레드 수의 관계는 반비례합니다.
이상하다.
이 질문이 꽤 오래되었지만 내 결과를 공유하고 싶습니다.
내 노트북은 25,000
스레드 를 생성하는 프로그램을 처리 할 수 있으며 모든 스레드는 2 초 간격으로 MySql 데이터베이스에 일부 데이터를 씁니다.
나는이 프로그램을 실행 10,000 threads
하기위한 30 minutes continuously
등, 다른 프로그램을 종료 한 후도 내 시스템이 안정적이고 나는 브라우징, 개방과 같은 다른 일반적인 작업을 할 수 있었다
와 25,000 threads
시스템 slows down
그러나 반응 남아있다.
로 50,000 threads
시스템 stopped responding
즉시 내가 수동으로 시스템을 다시 시작했다.
내 시스템 정보는 다음과 같습니다.
Processor : Intel core 2 duo 2.13 GHz
RAM : 4GB
OS : Windows 7 Home Premium
JDK Version : 1.6
실행하기 전에 jvm argument를 설정했습니다 -Xmx2048m
.
도움이 되길 바랍니다.
절대 이론적 인 최대는 일반적으로 프로세스의 인 스레드 스택 크기로 나눈 사용자 주소 공간 (모든 메모리는 스레드 스택을 위해 예약되어있는 경우 현실에서, 당신이 ... 작동하는 프로그램을하지 않지만).
예를 들어 32 비트 Windows에서는 각 프로세스에 2GB의 사용자 주소 공간이 있고 각 스레드에 128K 스택 크기가 부여되는 경우 최대 16384 개의 스레드 (= 2 * 1024 * 1024 / 128)를 기대할 수 있습니다. 실제로 XP에서 약 13,000을 시작할 수 있습니다.
그런 다음, 당신이 있는지 여부에 필수적이라고 생각 (가) 당신이 많은 코드에서 스레드가 아닌 (예 : 다음 ...가는 notifyAll ()를 호출 동일한 개체에 그들에게 모든 대기를 만들기로) 분명 어리석은 일을 할 것을 저글링을 관리 할 수 있습니다, 그리고 (b) 운영 체제가 할 수 있는지 여부. 원칙적으로, (a)에 대한 답변이 "예"이면 (b)에 대한 답변은 "예"입니다.
또한 Thread 생성자에서 스택 크기를 지정할 수 있습니다 . 이를 위해 VM 매개 변수를 망칠 필요가 없습니다.
Clojure의 이야기를 듣고 수천 개의 코어 (9000?)가있는 전시회에서 특정 기계에서 자신의 앱 중 하나를 실행해야한다고 들었습니다. 불행히도 현재 링크를 찾을 수 없습니다 (도움말?).
이를 바탕으로 하드웨어와 코드가 JVM이 아닌 제한 요소라고 말하는 것이 안전하다고 생각합니다.
Charlie의 DieLikeACode 클래스를 사용한 후 Java 스레드 스택 크기는 만들 수있는 스레드 수의 큰 부분 인 것 같습니다.
-Xss 설정 자바 스레드 스택 크기
예를 들어
자바 -Xss100k DieLikeADog
그러나 Java에는 Executor 인터페이스가 있습니다. 이를 사용하면 수천 개의 실행 가능한 작업을 제출할 수 있으며 실행자가 고정 된 수의 스레드로 해당 작업을 처리하게 할 수 있습니다.
Runnable
/가 Callable
실제로 계속 실행되어야하는 경우에는 작동하지 않습니다 . 그러나 SQL 쿼리에는 완벽합니다.
Mac OS X 10.6 32 비트 이상에서는 운영 체제에 따라 제한 (2560)이 있습니다. 이 stackoverflow 스레드를 확인하십시오 .
최신 (시스템화 된) Linux 시스템에 대한 추가 정보.
이 값에 대한 조정이 필요한 많은 자원이 있습니다 (예 : 최대 JVM 스레드 수를 늘리는 방법 (Linux 64 비트) ). 그러나 cgroup에서 pids.max를 설정하는 시스템화 된 "TasksMax"제한을 통해 새로운 제한이 적용됩니다.
로그인 세션의 경우 UserTasksMax 기본값은 커널 한계 pids_max (일반적으로 12,288)의 33 %이며 /etc/systemd/logind.conf에서 무시할 수 있습니다.
서비스의 경우 DefaultTasksMax 기본값은 커널 한계 pids_max의 15 % (보통 4,915)입니다. "systemctl edit"에서 TasksMax를 설정하거나 /etc/systemd/system.conf에서 DefaultTasksMax를 업데이트하여 서비스에 대해이를 무시할 수 있습니다.
여러 스레드를 처리 할 수 있습니다. 제한이 없습니다. 영화를 보거나 NetBeans를 사용하는 동안 다음 코드를 실행했으며 컴퓨터를 멈추지 않고 제대로 작동했습니다. 이 프로그램보다 더 많은 스레드를 유지할 수 있다고 생각합니다.
class A extends Thread {
public void run() {
System.out.println("**************started***************");
for(double i = 0.0; i < 500000000000000000.0; i++) {
System.gc();
System.out.println(Thread.currentThread().getName());
}
System.out.println("************************finished********************************");
}
}
public class Manager {
public static void main(String[] args) {
for(double j = 0.0; j < 50000000000.0; j++) {
A a = new A();
a.start();
}
}
}
main
을 던질 것이다 OutOfMemoryError
그것은 더 이상 스레드를 만들 수 없다는, 내 컴퓨터에서. 아마도 @AnilPal, 당신은 그것을 눈치 채지 못했습니다. main(..)
메소드 에 다른 print 문을 포함 시켜 오류 발생 후 새 스레드 생성이 중단되는 시점을 명확하게 확인 하는 것이 좋습니다 .