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


当前回答

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

其他回答

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

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

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

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

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

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

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

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

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