首页 新闻 会员 周边

java.lang.OutOfMemoryError:unable to create new native thread

0
悬赏园豆:20 [已解决问题] 解决于 2016-03-16 18:23

tomcat上发布的JavaWeb,业务高峰期出现(数据库的增删改查,hibernate+c3p0)
java.lang.OutOfMemoryError:unable to create new native thread错误。
修改Xmx,Xms,Xss为256M,256M,128K
用下面方法测试

import java.util.concurrent.CountDownLatch;
public class threadTest {
public void init(){
for (int i = 0;i<5000; i++) { 
System.out.println("i = " + i); 
new Thread(new HoldThread()).start(); 
} 
}
}

i=4000+时出现java.lang.OutOfMemoryError:unable to create new native thread错误。

现有一个疑问,即使我继续调小Xmx,增加thread的上限,但JVM是否有线程管理自动回收thread?如果thread只会增加不会减少,长时间运行后终会用尽。
目前观察只有重启tomcat才能清除已创建thread。

请问JVM是否有线程管理机制?是否需要设置或优化?

不应挽留的主页 不应挽留 | 初学一级 | 园豆:166
提问于:2016-03-10 22:25
< >
分享
最佳答案
0

sessionFactory采用单例模式,观察一段时间,暂未出现问题。

不应挽留 | 初学一级 |园豆:166 | 2016-03-16 18:23
其他回答(1)
0

单台机器4000个线程已经很多了,如果真的需要这么多线程,估计系统要扩展了

JDK对回收肯定没问题,一般用JDK的 ThreadPool

收获园豆:20
2012 | 园豆:21230 (高人七级) | 2016-03-11 08:22

请问JDK的ThreadPool回收需要设置么?比如我做过一个测试,i=4500时,出现unable to create new native thread错误,第一次我令i<4000,运行测试方法,不会抛出错误,我再次运行测试方法,i=500时就会抛出错误,说明前4000个thread没有被回收?

支持(0) 反对(0) 不应挽留 | 园豆:166 (初学一级) | 2016-03-11 12:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册