公司有一个服务,时常隔三岔五就挂掉。
实施反馈有一个服务,每隔两三天就会报502。之前的开发没处理,他们都是重启来解决这个问题的(因为用户少和这个服务不常用,所以这个问题就到了我手里)。
根据经验像是内存溢出
提示:
查看内存:jstat -gc (进程号)
YGC:新生代垃圾回收次数
YGCT:新生代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
这里没有看出什么异常
Memory Analyzerg:官网地址下载的时候注意选择中国的这个镜像,软件的教程可以去网上搜索下
保存堆快照文件命令
jmap -dump:format=b,file=dump.txt 108122(进程号)拉到 Memory Analyzer (JVM Heap Dump分析工具)里看了下,也没看出什么问题
以前遇到这样的情况,会有一个占用率特别多的地方。分析感觉应该是某一块代码,短时间导致内存溢出。
到了这里,我就去翻了一下。挂掉之前的日志文件,看看都执行了什么。日志文件上显示一条sql,在几秒内执行了上万次。好家伙,我找到那一块的代码一看stream的map()方法里面放了一个查询组织的方法(这个方法每次查询完会创建一个List)😢。我就把查询语句给抽离出了循环里面。
我感觉它应该是在一瞬间把伊甸园区,和幸存区给占满了。正常情况下,应该不会遇到短时间创建这么多集合的。