关于linux上的java线程最大限制问题
java的线程开启,默认的虚拟机会分配1M的内存,但是在4G的windows上线程最多也就开到300多 ,是因为windows本身的一些限制?
另外我想知道的是,在linux服务器上,linux默认给每个线程的内存是10M,那java在linux上开启线程到底是拿到1M还是10M的内存?不管是哪种方式, 一台4G的服务器,最多又能开多少个java线程呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
不知道32位和64位的虚拟机是否有区别?虚拟机的最大堆内存是否相关?
确实有这样一个值,但小于这个值的话虚拟机无法启动,而没有影响在线程数上。
回复
我的windows xp是32位系统,linux是64位系统,64位系统能创建的线程数要多一些。我后来是通过开多个进程,每个进程开5000个线程的方式解决大量连接的问题。
回复
和虚拟机最大堆内存没关系,应该和jvm帧栈的设置有关系。
回复
好,谢谢,目前对Java虚拟机工作机制还不太了解
上面的计算公式我没有在linux上测试过,但在windows xp上,结果并不是如此。
参考:http://hllvm.group.iteye.com/group/topic/38597
我在windows xp上,单进程可创建线程约3200多,设置-Xss非常小也没有什么起色。
在linux上,单进程可创建线程约6000多(好像接近7000),设置-Xss非常小也没有什么起色。
我认为java创建线程有内部的限制,改变ss参数影响没那么大(如果ss值很大,效果倒是很明显,只能创建很少的线程)。
windows xp机器配置intel dual core 3.0G + 3G
linux配置intel i3700 + 16G
回复
我在本地4G linux机器上大约启动了7000多个线程后抛出了虚拟机级别异常。一般非IO密集型的应用是不需要启动那么多线程的,不仅不会提高效率,反而还会因为线程过多切换拖慢速度。
回复
我是用两台机器启动线程去访问另外的一台机器,
回复
好的,另外,5000个线程每个线程每隔100毫秒访问一次,服务器没秒钟接收到的请求大概是多少呢?这个值会很接近50000么?还是说由于cpu的竞争会少很多?
回复
如过两台4g linux机的话你带上-Xss64k跑5000个线程吧,我在本地测了是不会出错的
虚拟机给每个线程分配的内存(栈空间)是由虚拟机参数-Xss来指定的,在不同平台上对应的默认大小可以 在oracle的官方文档上查询到:
http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman /optionX.html
其中,Linux64位默认Xss值为256K,并非1M或10M
回到问题,一个Java进程可以启动的线程数可以通过如下公式计算:
(系统剩余内存 - 最大堆容量Xmx - 最大方法区容量MaxPermSize)/ 最大栈空间Xss
如此,4G的服务器单个进程可以开多少线程,可以粗略计算出来。