阅读 26751 次
发表时间:2011-05-07

看到这位兄弟去支付宝面试的时候问到了这个问题,见http://www.iteye.com/topic/1032650

 

想探讨下jvm最大线程数到底和什么有关。

 

首先毋庸置疑的是和操作系统的位数,32位os能操作的最大内存只有2的32次方=4g,64位则无限制。

其次和jvm的启动参数-Xss设置的栈大小有关,sun jdk1.5以后默认为1m,每个线程在jvm都有自己的独立栈,

那最大线程数是否应该为 (本机jvm能使用的内存大小 - 参数(-Xmx)设置的大小)/-Xss大小 呢?

 

如有不对,请指教。

 

发表时间:2011-05-07
我,咋没人,周末都出去玩了?
发表时间:2011-05-08
感觉应该是这个:(2的32次方 - perm段的内存)/Xss
发表时间:2011-05-08
每个线程均会创建PC寄存器和JVM方法栈,PC寄存器占用的可能为CPU寄存器或操作系统内存,JVM方法栈占用的为操作系统内存,JVM方法栈为线程私有,其在内存分配上非常高效。
在Sun JDK中可以通过-Xss来指定其大小。

另外,“32位操作系统上位32G,64位无限制”指的是堆内存。

JVM规范将内存空间分为:方法区、堆、本地方法栈、PC寄存器、JVM方法栈。
发表时间:2011-05-08
谁说64位进程内存没有限制?  只不过比4G大很多而已。
而且这个问题要看操作系统 。在linux 上
jvm 的-Xss 可能就是ulimit -s 的效果

首先。 jvm就是一个普通进程而已, 应该也免不了这个限制。 在linux上都是LWP 所以你也要关注一下 sysctl kernel.pid_max
然后 还有当前用户总进程限制你也要看看 有没有被设置
在。/etc/security /limits.conf
还有一个是threads-max 这个是系统总线程限制,这样你也要关注一下别的进程的情况了 同样sysctl proc 都是可以修改的。
我知道的就这些。 还有你不能随便设置 好的方法是发现问题了去内核代码看 有没有默认值 有没有越界等等
所以正常(是正常哦)应该是

(该jvm进程用户态内存大小 - 堆,库已经等占用的内存) /栈大小 - jvm 内部使用掉的线程


我没有研究过jvm 内部对线程的 记录和限制 。 我感觉可能你还没关系到OS 限制,它就已经卡住了 。 求真想
发表时间:2011-05-08
sunzixun 写道
谁说64位进程内存没有限制?  只不过比4G大很多而已。
而且这个问题要看操作系统 。在linux 上
jvm 的-Xss 可能就是ulimit -s 的效果

首先。 jvm就是一个普通进程而已, 应该也免不了这个限制。 在linux上都是LWP 所以你也要关注一下 sysctl kernel.pid_max
然后 还有当前用户总进程限制你也要看看 有没有被设置
在。/etc/security /limits.conf
还有一个是threads-max 这个是系统总线程限制,这样你也要关注一下别的进程的情况了 同样sysctl proc 都是可以修改的。
我知道的就这些。 还有你不能随便设置 好的方法是发现问题了去内核代码看 有没有默认值 有没有越界等等
所以正常(是正常哦)应该是

(该jvm进程用户态内存大小 - 堆,库已经等占用的内存) /栈大小 - jvm 内部使用掉的线程


我没有研究过jvm 内部对线程的 记录和限制 。 我感觉可能你还没关系到OS 限制,它就已经卡住了 。 求真想


你是从os的限制角度来说的,其实我没有说出来的就是暂不考虑os内部机制,更多的是想从jvm的角度出发来分析最大线程的个数。

谢谢你的回复
发表时间:2011-05-08
http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html

给出一个有关能够创建线程的最大个数的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
发表时间:2011-05-08
iihero 写道
http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html

给出一个有关能够创建线程的最大个数的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads



谢谢,跟我想象的差不多,这里也有篇文章,http://icyfenix.iteye.com/blog/802573
大致也支持这样的观点。

 

发表时间:2011-05-09
iihero 写道
http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html

给出一个有关能够创建线程的最大个数的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads


意思是不是说-xss设置的线程栈的大小占用的是jvm本身占用的内存之外的内存?这个参数我都没用过,有人能解答一下吗?
另外线程数的大小是否会受到进程的限制?
发表时间:2011-05-09
对,-xss设置的栈参数:
是在创建jvm时native那边要指定的参数。每个java线程对应有一个native线程,它的栈大小由这个-Xss来指定。
Global site tag (gtag.js) - Google Analytics