(本文档仅供参考)
背景
目前使用系统的过程中,出现OOM后,会有可能导致系统不能正常使用,为进一步分析,进行测试验证后,情况如下:
1、通过压力测试工具或模拟页面进行测试;
2、在达到内存最大值后,就出现大量的线程抛出OutOfMemoryError的情况;
3、在停止测试后,经过长时间等待后,服务器处于一个半恢复、半宕机的状态。
分析
经分析研究:
1、服务器上会出现大量的ESTABLISHED状态的HTTP连接,并且不能正常释放;
2、从Tomcat的线程中跟踪看,正常情况下处理读取客户端网络请求的线程为ClientPoller-0 ClientPoller-1;
3、但是最终发现ClientPoller-0线程已经不存在;
4、从日志上看,目前发现应当是在压力太大后导致一些必要的线程被迫也退出了,从而导致Tomcat不能完全正常。
结论
此问题主要是无法从程序上控制哪些线程不要抛出OOM,它是由JVM控制的。
所以在个别线程OOM时,由于此线程退出后JVM可以快速恢复,这样是不会影响其它线程,也就不会影响Tomcat的运行;
但是大量线程OOM时,JVM会在各个线程上都有可能抛出OOM,从而导致一些必备的线程退出,引起宕机现象等。