坑爹的一次堆内存分析!!

2020-08-26 14:26:30 浏览数 (3)

背景

突然dingding 嗡嗡作响。内心一颤,打开一看。我早有一台服务内存95。 机会来了,露一手。 grafana 先观察了下。是慢慢的张上来的。说明有内存泄露。 jps ,jstat 。命令baba一敲。一看机器起了20多天竟然有11万次FGC。说出来你都不信吧。忘记截图了。具体每次GC时间给忘了(有点不专业了)。于是使用jmap dump包(有风险,当时和同事还评估了一下,可以搞),完成后 ,然后重启这台服务。

开始搞起

  1. 由于是生产机器,root权限下没有同步环境变量。所以在刚开始使用jps jmap这些命令都没有生效。所以使用了source /etc/profile 进行环境变量的同步
  2. 使用命令jps找到进程ID
  3. 使用 jmap -dump:format=b,file=dumpHeap.bin 28398 dump 文件到本目录下
  1. 由于我们使用的jumpserver 将文件最后移动到tmp文件下进行下载。但是由于权限不够,导致下载失败
  2. 于是使用chromd -777 设置文件的权限
  3. 花了9二虎之力,算是下载下来。
  4. 在本地使用jvisualvm命令进行dump heap 进行分析。
  1. 由于我dump下来的文件是.bin后缀,但是visualvm能打开的后缀是.hprof 所以需要修改。这个很简单如果你是使用的mac 的话直接显示简介直接更改后缀
  1. 直接使用visuavm 打开你的包就可以了。这个会花点时间
  1. 加载完毕后便可以看到你的heap的主信息了
  1. 这个时候就进行分析一下,是那一些对象占用了内存
  1. 好的那么我们再去看看这个对象都被那些对象引用了。前三个都看一下。
  1. 我尼玛!!!!!!! 内存不够,我电脑8G 这个对象大概是占用了3G。我把电脑的所有的都关掉。然后最后还是不行。 好吧我认输。明天换公司电脑继续搞一下。

总结

  1. 遇到问题一定要截图留下证据
  2. 线上环境谨慎操作每一步
  3. 8G内存真不够啊!!!!!

0 人点赞