一次Java虚拟机频繁GC问题排查

一天早上刚上班不久,客户开始反馈网站运行缓慢。然后,赶紧,查看了下应用的监控,然后发现应用在频繁的进行Full GC,并且每次Full GC后,老年代的内存都没有下降。然后,立马重启应用,但是过了一会儿还是有出现了相同的问题。随后,让运维加了启动参数(-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=e:dump.log),在每次Full GC前都dump下内存。
<p></p>

随后拿了dump文件来分析,分析工具使用MAT,eclipse的一个插件。使用该插件打开dump文件后,选择Leak Suspects,最后发现有个对象MessageDetailDTO有15万多个,如下图:

Java虚拟机

Java虚拟机

通过以上两张图,定位到是在打日志的时候,将查询出的数据全部通过fastjson打印出日志了,造成内存占用过多,而且该数据查询很频繁,每次返回的都是好几万条,到这里问题就已经找到了,需要修复了。
将查询修改为分页查询,每次只查询1500条,并且日志中不在将这些查询出的数据打印出来。修复好之后,立马上线,观察情况,通过好几天的连续观察,没有再发生过一次Full GC,效果明显。
如果我们发现应用有内存溢出,或者频繁Full GC的情况下,还是需要去分析dump文件。

原创文章,作者:zfj-zfj,如若转载,请注明出处:https://www.zfjsec.com/127.html
-- 展开阅读全文 --
Idea运行项目卡顿解决办法小记(mac与windows解决)
« 上一篇 04-26
树莓派声卡测试
下一篇 » 04-27

发表评论