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


当前回答

这取决于您使用的CPU、操作系统、其他进程在做什么、您使用的Java发行版以及其他因素。我曾经见过一台Windows服务器在关闭机器之前有> 6500个线程。当然,大多数线程都没有做任何事情。一旦机器达到大约6500个线程(在Java中),整个机器就开始出现问题,变得不稳定。

我的经验表明,Java(最新版本)可以愉快地使用计算机本身所能承载的尽可能多的线程,而不会出现问题。

当然,你必须有足够的RAM,你必须有足够的内存来启动Java,以完成线程正在做的所有事情,并为每个线程有一个堆栈。任何具有现代CPU(最近几代AMD或Intel)和1 - 2gig内存(取决于操作系统)的机器都可以轻松支持具有数千个线程的JVM。

如果你需要一个比这更具体的答案,你最好的选择是侧写。

其他回答

现代(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来覆盖该服务

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

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

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

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

这取决于您使用的CPU、操作系统、其他进程在做什么、您使用的Java发行版以及其他因素。我曾经见过一台Windows服务器在关闭机器之前有> 6500个线程。当然,大多数线程都没有做任何事情。一旦机器达到大约6500个线程(在Java中),整个机器就开始出现问题,变得不稳定。

我的经验表明,Java(最新版本)可以愉快地使用计算机本身所能承载的尽可能多的线程,而不会出现问题。

当然,你必须有足够的RAM,你必须有足够的内存来启动Java,以完成线程正在做的所有事情,并为每个线程有一个堆栈。任何具有现代CPU(最近几代AMD或Intel)和1 - 2gig内存(取决于操作系统)的机器都可以轻松支持具有数千个线程的JVM。

如果你需要一个比这更具体的答案,你最好的选择是侧写。