运维打电话说生产的一个服务进程挂了,他先重启下。 运维监控显示Jvm的堆内存占用一直很高,大于90%。 检查了下jvm 内存确实分配的有问题,比正常需要的要小。查看进程的erro日志, “ Out of Memory Error ” 赫然在目, 遂调整了堆内存分配,重启了事。
a few days later ....
运维来电话。。你这个服务进程又挂了……
观察了运维监控日志, 堆内存使用正常。查看下进程的error 日志。 仍然是 “ Out of Memory Error ”。这说明不是堆内存不足了,那可能是栈内存。 仔细的定眼一看,
pool -5374 .线程池,已经开到5374 了。后面的thread 排到6. 那起码已经有了30000+的线程数了。 这肯定线程池的使用有问题, 泄露了没有释放。把栈内存用光了。
全工程搜了下 Threadpool 果然方法中new threadpool ,运行后没有shutdown的。 根本问题解决。
1. out of memory 不只是堆内存不足, 虽然比较常见。
2. ThreadPool 使用要谨慎, 使用不当属于大杀器。 局部使用要记得shutdown。
newFixedThreadPool The threads in the pool will exist until it is explicitly {@link ExecutorService#shutdown shutdown}.