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


当前回答

至少在Mac OS X 10.6 32位上,操作系统有一个限制(2560)。检查这个stackoverflow线程。

其他回答

当我在我的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();
        }
    }
 }

理论上的绝对最大值通常是进程的用户地址空间除以线程堆栈大小(尽管在现实中,如果所有的内存都留给线程堆栈,那么程序就无法正常工作……)

例如,在32位Windows下,每个进程的用户地址空间为2GB,给每个线程128K的堆栈大小,您期望的绝对最大值为16384个线程(=2*1024*1024 / 128)。在实践中,我发现在XP下我可以启动大约13,000。

然后,我认为你本质上是(a)你是否可以在你的代码中管理这么多线程,而不是做明显的愚蠢的事情(比如让它们都等待同一个对象,然后调用notifyAll()…),以及(b)操作系统是否可以。原则上,如果(a)的答案也是“是”,那么(b)的答案就是“是”。

顺便说一句,你可以在Thread的构造函数中指定堆栈大小;你不需要(可能也不应该)为此而打乱VM参数。

至少在Mac OS X 10.6 32位上,操作系统有一个限制(2560)。检查这个stackoverflow线程。

我知道这个问题很老了,但我还是想分享一下我的发现。

我的笔记本电脑能够处理产生25000个线程的程序,所有这些线程以2秒的间隔在MySql数据库中写入一些数据。

我用10,000个线程连续运行这个程序30分钟,然后我的系统也很稳定,我能够做其他正常的操作,如浏览,打开,关闭其他程序等。

当有25,000个线程时,系统速度变慢,但仍保持响应。

当有50,000个线程时,系统立即停止响应,我不得不手动重启系统。

我的系统详细信息如下:

Processor : Intel core 2 duo 2.13 GHz
RAM : 4GB
OS : Windows 7 Home Premium
JDK Version : 1.6

在运行之前,我设置jvm参数-Xmx2048m。

希望能有所帮助。

现代(systemd) linux系统的附加信息。

有很多关于这个值的资源可能需要调整(例如如何增加JVM线程的最大数量(Linux 64bit));然而,一个新的限制是通过systemd“TasksMax”限制来设置pid。Max在cgroup上。

对于登录会话,UserTasksMax默认值是内核限制pids_max的33%(通常是12,288),可以在/etc/systemd/logind.conf中重写。

对于服务,DefaultTasksMax默认值是内核限制pids_max的15%(通常是4,915)。您可以通过在“systemctl edit”中设置TasksMax或在/etc/systemd/system.conf中更新DefaultTasksMax来覆盖该服务