programing

Java VM은 몇 개의 스레드를 지원할 수 있습니까?

goodsources 2022. 7. 16. 14:05
반응형

Java VM은 몇 개의 스레드를 지원할 수 있습니까?

Java VM은 몇 개의 스레드를 지원할 수 있습니까?벤더에 따라 다른가요?operating system에 의해서요?다른 요인들?

이것은, 사용하고 있는 CPU, OS, 다른 프로세스의 동작, 사용하고 있는 Java 릴리스, 및 그 외의 요인에 의해서 다릅니다.머신을 다운시키기 전에, Windows 서버의 스레드가 6500을 넘는 것을 본 적이 있습니다.물론 대부분의 스레드는 아무것도 하지 않았습니다.기계가 약 6500 스레드(Java)에 도달하자 기계 전체가 문제가 발생하여 불안정해지기 시작했습니다.

제 경험에 따르면 Java(최근 버전)는 컴퓨터 자체에서 호스트할 수 있는 스레드 수만큼 문제없이 사용할 수 있습니다.

물론 충분한 RAM과 스레드가 수행하는 모든 작업을 수행할 수 있는 충분한 메모리로 Java를 시작하고 각 스레드에 대한 스택을 보유해야 합니다.최신 CPU(최신 2세대 AMD 또는 Intel)와 1~2기가비트 메모리(OS에 따라 다름)를 탑재한 머신이라면 수천 개의 스레드를 갖춘 JVM을 쉽게 지원할 수 있습니다.

이것보다 더 구체적인 답변이 필요한 경우 프로파일을 작성하는 것이 최선입니다.

음, 많이요.

여기에는 몇 가지 파라미터가 있습니다.특정 VM과 VM에는 일반적으로 런타임 매개 변수가 있습니다.이는 운영체제에 의해 다소 좌우됩니다.기본 OS는 스레드에 어떤 지원을 제공하고 있으며 스레드에 어떤 제한을 가하고 있습니까?VM이 실제로 OS 레벨의 스레드를 사용하는 경우는, 낡은 빨간색 스레드/녹색 스레드입니다.

"지원"이 의미하는 바는 또 다른 질문입니다.만약 당신이 자바 프로그램을 쓴다면, 그것은 단지 다음과 같다.

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

인텔의 OS/X 10.5.6 및 Java 6 5(댓글 참조)에 대해서는, 이하에 기재되어 있습니다.

새 스레드 #2547새 스레드 #2548새 스레드 #2549스레드를 작성할 수 없습니다: 5새 스레드 #2550스레드 "main" java.lang에 예외가 있습니다.Out Of Memory Error: 새 네이티브 스레드를 만들 수 없습니다.를 참조해 주세요.Thread.start0(네이티브 메서드)를 참조해 주세요.Thread.java:592)Die Like에서ADog.main(DieLike)ADog.java:6)

Charlie Martin의 투고를 읽고 히프 사이즈에 따라 작성할 수 있는 스레드 수가 달라지는지 궁금해서 그 결과에 어안이 벙벙했습니다.

Vista Home Premium SP1에서 JDK 1.6.0_11을 사용하여 Charlie의 테스트 어플리케이션을 2MB에서 1024MB 사이의 다양한 힙 크기로 실행했습니다.

예를 들어 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 을 설정합니다.-Xmx2048m.

도움이 됐으면 좋겠다.

이론상 절대 최대값은 일반적으로 프로세스의 사용자 주소 공간을 스레드 스택 크기로 나눈 값입니다(그러나 실제로는 모든 메모리가 스레드 스택용으로 예약되어 있으면 작동 프로그램이 없습니다).

예를 들어 32비트 Windows에서는 각 프로세스의 사용자 주소 공간이 2GB이고 각 스레드의 스택 크기가 128K인 경우 절대 최대 16384 스레드(=2*snd*snd/128)가 예상됩니다.실제로 XP에서는 약 13,000개를 시작할 수 있습니다.

그리고 (a) 코드 내의 많은 스레드를 관리할 수 있는지 여부(같은 오브젝트에서 대기시키고 notifyAll()을 호출하는 등)와 (b) 운영체제가 가능한지에 대해 기본적으로 관심이 있다고 생각합니다.원칙적으로 (b)에 대한 대답은 (a)에 대한 답변도 "예"일 경우 "예"이다.

참고로 스레드 컨스트럭터에서 스택사이즈를 지정할 수 있습니다.이것에 대해서 VM 파라미터를 조작할 필요는 없습니다(아마도 조작하지 않는 것이 좋습니다).

찰리의 'DieLike'를 가지고 놀다가ACode 클래스는 Java 스레드 스택 크기가 작성할 수 있는 스레드 수의 대부분을 차지하는 것 같습니다.

- XSS 자바 스레드 스택 크기 설정

예를들면

Java - Xss100k 다이라이크ADog

그러나 Java에는 Executor 인터페이스가 있습니다.이를 사용하면 수천 개의 실행 가능한 태스크를 제출할 수 있으며 실행자가 일정한 수의 스레드를 사용하여 이러한 태스크를 처리할 수 있습니다.

나는 그가 수천 개의 코어(9000?)를 가진 무역 박람회에서 특별한 기계에서 앱을 실행하게 된 Clojure 이야기를 들은 것을 기억한다.죄송하지만 링크를 찾을 수 없습니다(도움말?).

이를 바탕으로 하드웨어와 코드가 JVM이 아닌 제한 요소라고 해도 무방할 것 같습니다.

최신 (systemd) Linux 시스템에 대한 추가 정보.

여기에는 조정이 필요한 값(JVM 스레드의 최대 수를 늘리는 방법(Linux 64비트) 등)이 많이 있지만 cgroup에 pids.max를 설정하는 systemd "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를 업데이트할 수 있습니다.

Trisquel linux (Ubuntu 18.04)를 실행하는 2GB Samsung AMD 프로세서 노트북에서 이 주제를 연구했을 때.9534개의 스레드를 관리할 수 있으며, 그 후 특유의 예외를 발생시킵니다.

at java.base/java.lang.Thread.start0(Native Method)
at java.base/java.lang.Thread.start(Thread.java:803)
at Main.main(Main.java:11)

코드:

public class MultithreadingRunnable implements Runnable {
    public void run() {
        System.out.println("ThreadID " +  Thread.currentThread().getId());
    }
 }



public class Main {
    public static void main(String[] ars) {

        for(int i = 0;i<10000;i++){
            Thread mr = new Thread(new MultithreadingRunnable());
            mr.start();
        }
    }
 }

적어도 Mac OS X 10.6 32비트에서는 운영 체제에 따라 제한(2560)이 있습니다.stackoverflow 스레드를 체크합니다.

최대 스레드 수는 다음 사항에 따라 달라집니다.

  • 마이크로프로세서, RAM 등의 하드웨어 구성.
  • 32비트 또는 64비트 운영체제
  • 실행 메서드 내의 코드.실행 메서드 내의 코드가 클 경우 단일 스레드 개체에 더 많은 메모리가 필요합니다.
  • 2017년...다이라이크ADOG 수업

    새로운 스레드 #92459 스레드 "main" java.lang의 예외입니다.Out Of Memory Error: 새 네이티브 스레드를 만들 수 없습니다.

    i7-7700 16GB RAM

    스레드 수만큼 처리할 수 있습니다.제한은 없습니다.영화를 보거나 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();
            }
        }
    }
    

    언급URL : https://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support

    반응형