項目運行了一段時間 運維那邊反饋項目內存過高,首先我們把線上的jvm內存文件導出來,來看看哪些對象有問題 , 我這邊演示就在windows中的cmd演示了 因為jdk提供的命令都一樣
1查看java進程 命令: jps-l
可以看到我們的java進程id是 149992
2導出內存文件到本地,如果是在服務器中需要把文件 下載到本地做分析
命令:jmap -dump:format=b,file=heapdump.phrof 149992(jvm進程id)

可以看到 我們的內存文件以 phrof結尾,已經下載到我們的C:\Users\Adminstrator\下
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
