隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat

此处是转载的  是给自己做的备注

问题:隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat

原因查找
由于tomcat自身log中并无错误产生,磁盘空间足够,读写也正常,排除其他原因后怀疑是jvm崩溃导致,于是查gc日志:
隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat
从上图可以看出每次full GC是老年代内存占用量相当小,远没有达到它的最大值,持久代也一样,而且每次GC过后,占用量基本没有变化,也就是说,每一次full GC都是在做无用功,白白浪费掉了一大批性能。从内存占用率方面看不是内存分配不够,应该是程序代码方面的问题,于是找开发协助。后来在相关开发人员的协助下发现代码中有主动调用System.gc()的地方,网上搜了下,发现即便是官网也不推荐代码中出现System.gc(),也不敢保证使用它对应用程序性能和稳定性方面的影响。其实从jvm配置层面也可以禁用掉主动的gc()方法调用,加上参数“-XX:+DisableExplicitGC”就可以了,于是加上此参数后重启tomcat,过一段时间查看gc log,OK,原因找到,问题解决!后台也给开发那边建议不要在代码中主动调用System.gc()方法,交由jvm本身自动处理gc。

解决方法:jvm配置加参数“-XX:+DisableExplicitGC”;代码中禁止调用System.gc();

上一篇:如何占用你用户的时间 and 如何提高客户的满意度 。 待续


下一篇:【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)