web容器用的是tomcat8,jdk8,都是64位的。 在应用中有一个循环来调用ICE接口,使用的是ICE的库,调用的时候会创建大量的线程,到了一定的时候就会报错,tomcat退出。在tomcat bin目录下生成hs_err_pidxxx.log文件,开头错误提示:
# # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 1817056 bytes for Chunk::new
-------------------- 查了下,应该是没有内存创建更多的线程了。
下面截一张jconsole的图,保留了tomcat退出时的vm状况,里面还有我的tomcat的启动参数等信息。我的问题是,这里显示的启动的线程总数显然是太大了,但活动线程只有43个,那些不活动的线程是否没有回收?我在每次循环结束都调用gc(),并且观察到堆内存被较好地控制在70M左右,不往上涨了,说明gc()是起作用了,但线程为什么没有回收?这种局面有什么办法可破?