天天看点

jvm内存溢出问题详解

      你好,欢迎阅读本文,希望对你有帮助

       前些天线上某系统访问异常,出现卡的现象,并且一天出现了两次。第一次排查到调用三方服务响应异常,通知三方服务负责人员排查问题。我对本系统的处理就是重启了一下,观察半小时系统一切正常,就去忙其他的了。可是……过了4个小时左右又出现卡顿,系统打不开的情况。再次打开日志,第一眼看到的还是调用三方服务超时,并且还是调用多个都超时,没有第一时间怀疑是自己系统问题,就又通知三方服务负责同事排查。再次重启下系统先解决问题。问题下图:

jvm内存溢出问题详解

       可是总感觉哪不对,会不会再过几个小时又出现问题,于是打开日志仔细排查,最后竟然发现OOM………………。感觉很震惊。系统都已经运行了一年多了,怎么可能?我仔细查看了当前服务器配置和部署的服务,发现当前服务器配置4核8G内存。总共部署了4个服务,内存分配如下:

jvm内存溢出问题详解

     这已经占用了6G内存,在加上系统本身占用内存,显然是不够用的了。出问题系统是第一个,堆内存分配1G,元数据分配256M。

     所以判断是当前服务分配内存不够大,在调用其他服务超时,导致本身服务的积压,堆内对象不能及时垃圾回收,进而使内存增长,产生OOM。

   问题基本找到了。现在解决办法是升级当前服务内存,就把其他两个系统访问量不大的减少了内存,分配到出问题内存。多了0.5G,到写本文的时候系统已经运行半天,还是正常,堆内存情况:

jvm内存溢出问题详解

问题基本解决,不过还是调用三方服务时,设置超时时间要适当,超时或者服务有问题要快速返回。

谢谢阅读,服务器运行情况会继续跟踪,如果新问题会及时分享。