小组Java

转自: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();

2 2 收藏


直接登录
最新评论
  • aaa   2016/09/08

    这个不能一概而论,比如RMI,你不让它手动调,不一定什么时候它就坑你一下,看自己情况吧,另外tomcat这种情况下应该有crash日志啊,没找到还是怎么了?

  • DawnL 服务器端 2016/09/11

    禁用后要注意堆外内存情况