发表时间: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
|
|
发表时间: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来指定。 |