一个Java虚拟机可以支持多少线程?这因供应商而异吗?按操作系统?其他因素?


当前回答

最大线程数取决于以下因素: 硬件配置,如微处理器,RAM。 操作系统是32位还是64位 run方法内部的代码。如果run方法内的代码很大,那么单个线程对象将有更多的内存需求

其他回答

你可以处理任意数量的线程;没有限制。我在看电影和使用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();
        }
    }
}

在阅读了Charlie Martin的文章后,我很好奇堆大小是否会对您可以创建的线程数量产生影响,结果完全让我目瞪口呆。

使用Vista Home Premium SP1上的JDK 1.6.0_11,我执行Charlie的测试应用程序,使用不同的堆大小,在2mb到1024mb之间。

例如,要创建一个2 MB的堆,我将使用参数-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

堆大小肯定很重要。但是堆大小和最大线程数之间的关系是反比的。

这很奇怪。

我记得我听过一个关于Clojure的演讲,他在一个贸易展览会上在一些有数千个(9000个?)核的专业机器上运行他的一个应用程序,然后它把它们都加载了。不幸的是,我现在找不到链接(帮助?)

基于此,我认为可以肯定地说,硬件和代码是限制因素,而不是JVM。

在摆弄了Charlie的dielikecode类之后,Java线程堆栈大小似乎是您可以创建的线程数量的很大一部分。

设置java线程堆栈大小

例如

java -Xss100k DieLikeADog

但是,Java有Executor接口。我会使用它,你将能够提交数千个可运行的任务,并让Executor处理这些任务与固定数量的线程。

当我在我的2GB三星AMD处理器笔记本电脑上运行Trisquel linux (Ubuntu 18.04)研究这个主题时。它可以管理9534个线程,然后抛出特殊的异常

在java.base / java.lang.Thread。start0(本地方法) 在java.base / java.lang.Thread.start (Thread.java: 803) 在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();
        }
    }
 }