扫码关注公众号:芋道源码

发送: 百事可乐
获取永久解锁本站全部文章的链接

《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.importnew.com/10780.html 「流浪的侠客」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

McGovernTheory在StackOverflow提了这样一个问题:

Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗?

Eddie的回答:

这取决于你使用的CPU,操作系统,其他进程正在做的事情,你使用的Java的版本,还有其他的因素。我曾经见过一台Windows服务器在宕机之前有超过6500个线程。当然,大多数线程什么事情也没有做。一旦一台机器上有差不多6500个线程(Java里面),机器就会开始出问题,并变得不稳定。

以我的经验来看,JVM容纳的线程与计算机本身性能是正相关的。

当然了,你要有足够的本机内存,并且给Java分配了足够的内存,让每个线程都可以拥有栈(虚拟机栈),可以做任何想做的事情。任何一台拥有现代CPU(AMD或者是Intel最近的几代)和1-2G内存(取决于操作系统)的机器很容易就可以支持有上千个线程的Java虚拟机。

如果你需要一个更精确的答案,最好是自己做压测。

Charlie Martin的回答:

这里有很多的参数(可以设置)。对于特定的虚拟机,都会有自己的运行时参数。(最大线程数)一定程度上由操作系统决定的:底层的操作系统要给线程提供哪些支持?施加哪些限制?虚拟机使用的是原生的操作系统的线程还是red thread或者green thread?

操作系统提供的支持是另一个问题。如果你向下面这样写Java程序:

img

(不要抱怨语法细节,这才刚刚开始)那你当然希望能得到成百上千个运行的线程。但是,创建一个线程的成本是相对较大的,(过多线程)调度的开销会变得突出。能否让这些线程做有用的事情还不确定。

升级版

好了,迫不及待了!下面是我的一个加了点润色的小的测试程序:

img

在Intel的OS/X 10.5.6系统上,Java 5的输出如下:

img

benjismith的回答:

读了Charlie Martin的回复以后,我很想知道堆内存的大小是否能够给创建的线程数带来不同,然后我就被结果惊呆了:在Vista Home Premium SP1系统上,使用JDK 1.6.0_11,设置堆内存的大小从2M到1024M来执行Charlie的测试程序。比如:创建2M的堆内存,我使用的虚拟机参数是:-Xms2m -Xmx2m.

下面是我的测试结果:

img

所以,堆的大小确实很重要。但是,堆大小和最大线程数却是呈反比例关系。
这太诡异了!

Neil Coffey的回答:

绝对理论上的最大线程数是进程的用户地址空间除以线程栈的大小(现实中,如果内存全部给线程栈使用,就不会有能运行的程序了)。因此,以32位Windows系统为例,每一个进程的用户地址空间是2G,假如每个线程栈的大小是128K,最多会有16384(=210241024 / 128)个线程。实际在XP系统上,我发现大约能启动13000个线程。

然后,我认为,你的问题本质上是:(a)你是否可以在你的代码中有效的管理许多的线程,不让他们做很显然是愚蠢的事情(比如:让他们在同一个object对象上等待随后被调用notifyAll()…),(b)操作系统是否可以有效地管理这许多线程。基本上来说,如果(a)的答案是”yes”的话,(b)的答案也是”yes”。

很巧的是,你可以在Thread的构造函数中设置线程栈的大小,但是,你不需要也不应该把这个和虚拟机参数弄混淆。

文章目录
  1. 1. Eddie的回答:
  2. 2. Charlie Martin的回答:
  3. 3. benjismith的回答:
  4. 4. Neil Coffey的回答: