开源中文网

您的位置: 首页 > 编程开发 > Java语言设计 > 正文

记一次jvm内存疯狂fullGC原因查找

来源: ChinaUNIX  作者: ldcrgmy

环境:centOS6.5、tomcat7、jdk1.7

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

原因查找
由于tomcat自身log中并无错误产生,磁盘空间足够,读写也正常,排除其他原因后怀疑是jvm崩溃导致,于是查gc日志:

从上图可以看出每次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();

Tags:内存 原因
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明