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是否有线程管理机制?是否需要设置或优化?
sessionFactory采用单例模式,观察一段时间,暂未出现问题。
单台机器4000个线程已经很多了,如果真的需要这么多线程,估计系统要扩展了
JDK对回收肯定没问题,一般用JDK的 ThreadPool
请问JDK的ThreadPool回收需要设置么?比如我做过一个测试,i=4500时,出现unable to create new native thread错误,第一次我令i<4000,运行测试方法,不会抛出错误,我再次运行测试方法,i=500时就会抛出错误,说明前4000个thread没有被回收?