项目运行了一段时间 运维那边反馈项目内存过高,首先我们把线上的jvm内存文件导出来,来看看哪些对象有问题 , 我这边演示就在windows中的cmd演示了 因为jdk提供的命令都一样
1查看java进程 命令: jps-l
可以看到我们的java进程id是 149992
2导出内存文件到本地,如果是在服务器中需要把文件 下载到本地做分析
命令:jmap -dump:format=b,file=heapdump.phrof 149992(jvm进程id)
可以看到 我们的内存文件以 phrof结尾,已经下载到我们的C:UsersAdminstrator下
3使用eclipse分析我们的内存文件,
首先我们要下载一个eclipse软件 接下来我们要在eclipse软件中安装一个插件来分析,这个插件是 Eclipse Memory Analyzer(MAT),
我们打开 eclipse 中工具栏的 Help-》Install New Software 如下图所示
我们点击 Add按钮 输入以下配置
经过一系列的安装,安装成功后 我们打开Memory Analysis 内存分析工具
然后把我们的内存文件 拖拽到空白处如下图所示:
会出现一个提示框 如下图:
内存文件可视化图就出现了
我们来了解一下底部的信息, 是什么意思 如何分析
1.Histogram可以列出内存中的对象,对象的个数以及大小。
2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
3.Top consumers通过图形列出最大的object。
4.Leak Suspects通过MA自动分析泄漏的原因。
分析:
Histogram如下图:
Objects:类的对象的数量;
Shallow size:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和;
Retained size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
4具体分析:
4.1我们通过Histogram分析 可以看到这个对象占用了很多内存,空间
4.2 我们通过线程分析Dominator Tree 可以看到线程当中占用最多的线程中的类
4.3 我们通过 MA自动分析漏洞原因
总结:
,com.lmax.disruptor.RingBuffer类来自于skyWalking jar包中
导致内存过高,卸扣的是skyWalking