背景
突然dingding 嗡嗡作响。内心一颤,打开一看。我早有一台服务内存95。 机会来了,露一手。 grafana 先观察了下。是慢慢的张上来的。说明有内存泄露。 jps ,jstat 。命令baba一敲。一看机器起了20多天竟然有11万次FGC。说出来你都不信吧。忘记截图了。具体每次GC时间给忘了(有点不专业了)。于是使用jmap dump包(有风险,当时和同事还评估了一下,可以搞),完成后 ,然后重启这台服务。
开始搞起
- 由于是生产机器,root权限下没有同步环境变量。所以在刚开始使用jps jmap这些命令都没有生效。所以使用了source /etc/profile 进行环境变量的同步
- 使用命令jps找到进程ID
- 使用 jmap -dump:format=b,file=dumpHeap.bin 28398 dump 文件到本目录下
- 由于我们使用的jumpserver 将文件最后移动到tmp文件下进行下载。但是由于权限不够,导致下载失败
- 于是使用chromd -777 设置文件的权限
- 花了9二虎之力,算是下载下来。
- 在本地使用jvisualvm命令进行dump heap 进行分析。
- 由于我dump下来的文件是.bin后缀,但是visualvm能打开的后缀是.hprof 所以需要修改。这个很简单如果你是使用的mac 的话直接显示简介直接更改后缀
- 直接使用visuavm 打开你的包就可以了。这个会花点时间
- 加载完毕后便可以看到你的heap的主信息了
- 这个时候就进行分析一下,是那一些对象占用了内存
- 好的那么我们再去看看这个对象都被那些对象引用了。前三个都看一下。
- 我尼玛!!!!!!! 内存不够,我电脑8G 这个对象大概是占用了3G。我把电脑的所有的都关掉。然后最后还是不行。 好吧我认输。明天换公司电脑继续搞一下。
总结
- 遇到问题一定要截图留下证据
- 线上环境谨慎操作每一步
- 8G内存真不够啊!!!!!