服务器出现OOM了怎么办
第一步:保存现场
之前不懂,输入命令 jmap -histo:live < pid >,导致JVM被强制fullGC了,现场被破坏了。所以我们记得不用使用live这个选项,它会强制FullGC。
- 首先,获取进程号。可以通过jps -lv 或者ps -ef | grep ‘你的工程名’,用这两个命令可以拿到pid。
- 看实例对象的数量以及大小。jmap -histo [ pid ] > /xxx/xxx.txt,通过这种方式,可以把现场保存成文件。
- 生成内存快照,可以用工具分析。jmap -dump:format=b,file=/xxx/xxx.hprof [ pid ]
第二步:分析现场
如果文件不大,可以通过jvisualvm工具或eclipse memory analyzer工具分析。
- 首先我们看看实例对象的快照。可以发现int byte char类型的实例对象有很多。
- 接下来我们通过工具可以看出char类型中,这个实例对象的内存占用大,而且数量还不少。
第三步 分析代码
我们发现,代码中只有这段方法,会使用到上述对象:
在代码中,当请求接口失败时,会尝试3次,每次都会生成json对象。只有3次都失败才退出方法。而当我们观察服务器的日志可以发现,日志中出现大量调用接口的语句。因此,我们基本可以锁定此次OOM的罪魁祸首了。