排查线上内存泄漏,RingBufferLogEvent类内存占用过高,skyWalking内存占用过高

项目运行了一段时间 运维那边反馈项目内存过高,首先我们把线上的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

原文地址:https://www.cnblogs.com/langjunnan/p/15339103.html