Eclipse Memory Analyzer入門教程

結構總覽

1550831221425

記住下面名詞的解釋:數組

Shallow Heap:表明當前對象佔用的內存空間;緩存

Retained Heap:表明當前對象被回收後所能釋放的內存空間大小。異步

一些操做:工具

List objects -> with outgoing references :列出包含哪些對象;線程

List objects -> with ingoing references :列出被哪些對象包含;3d

第一行的Regex中均可以填寫過濾表達式快速篩選本身想分析的類。code

1551079444283

1 Detail

這部分統計了當前堆已使用的總大小cdn

Size: 18.8 MB Classes: 8.3k Objects: 325.8k Class Loader: 119 Unreachable Objects Histogram對象

總大小: 18.8M 類大小8.3kb 對象:325.8k 類加載器:119kblog

Unreachable Objects 表明根不可達的對象,便可以被回收的對象,以下圖所示,能夠發現最大的前幾位對象是char[],String,byte[]和TRNameListHitRecord對象,這是因爲壓測時請求量太大,生成了大量的TRNameListHitRecord對象,在對象異步入庫後被釋放致使。

img

2 Biggest Objects by Retained Size

這部分表明目前應用中最大的幾個對象的總大小,這部分的數據能夠用來分析應用是否可能發生內存泄漏,留在後面Leak Suspects中介紹。

3 Actions

3.1 Histogram

應用中各個類所佔用內存大小的直方圖,倒序排列

能夠看到NameList類一共有10078個,黑名單和白名單各5000個左右,佔用了241872/1024/1024=0.23M,Retained heap大小爲725624/1024/1024=0.69M,符合預期。

img

還能夠在第一行的regex裏填寫條件,此時填寫應用的包名,就能夠過濾到目前應用中全部對象佔用的內存大小,以下圖,能夠發現,沒有什麼問題,NameList是黑白名單的緩存信息,其餘的數量都不多。

1550890183795

3.2 Dominator Tree

應用中各個對象佔比,倒序排列,能夠展開某條數據查看其內部具體包含哪些變量及變量的內存佔比。第一行的Regex表達式一樣能夠根據本身的須要進行過濾。

能夠發現系統中目前最大的對象爲SynMap,它是存儲黑白名單的對象,2162040/1024/1024=2.06M,符合預期。

1550889506708

3.3 Top Consumers

分析應用中資源消耗最高的對象(Biggest Object)、類(Biggest Top-Level Dominator Classes)、類加載器(Biggest Top-Level Dominator Class Loaders)及包(Biggest Top-Level Dominator Packages)。

1550890433755

除了包以外,上面三個統計都有一個餅圖展現結合一個表格展現。好比展開對象的統計信息以下圖所示,同Dominator Tree中統計信息相同。

1550890459861

3.4 Duplicate Classes

發現被不一樣類加載器重複加載的類,以下圖所示,發現都是Lambda相關的,無應用中的類,符合預期。

1550890740961

4 Report

4.1 Leak Suspects

幫助分析應用內存泄漏的工具,結合了餅圖與問題列表的形式展現分析結果,能夠直接點擊問題的Details跳轉到具體的問題中進行分析。

本應用懷疑有三個地方有內存泄漏,第一個和第三個是類加載器及線程組

1550892184713

點擊第二個problem 的detail 進行查看,能夠看到問題詳情頁中包含五個部分:

1.Description(問題描述)

一個名爲SynMap被WebAppClassLoader加載的對象共佔用了2162040 bytes(佔當前已使用內存的10%)。內存累積在 加載器加載的HashMap$Node實例中。

1551062337907

2.Shortest Paths To the Accumulation Point(問題對象到GC根節點的最短路徑)

當前分析出來的問題對象HashMap是用來存儲黑白名單緩存的對象,能夠看到導GC根節點時通過了SynMap,最終被多個Thread使用。因此此處能夠排除非應用中的內存泄漏。

img

3.Accumulated Objects in Dominator Tree(以當前問題對象爲根的Dominator支配樹)

此處列出了HashMap的支配樹,能夠發現它是被SynMap引用且包含了一個大小爲16384的數組,點擊下圖紅線的節點,從左邊的Attributes中能夠查看其具體的屬性。

img

4.Accumulated Objects by Class in Dominator Tree(以當前問題對象爲根的Dominator支配樹按類的維度分類統計)

這裏實際上是將上面的支配樹中的對象按類彙總了一下,查看相關類佔用的內存大小。

1551064233151

5.All Accumulated Objects by Class(全部對象按類的維度統計佔用內存分析)

這裏不一樣上面的支配樹中的類統計,是將全部該對象中使用到的類進行了彙總統計。發現Char[]佔用了最大,其次是Date對象,這裏咱們只觀察下大小便可。

img

4.2 Top Components

展現了大於1%內存的組件

img

沒有發現跟應用相關的類,咱們能夠點擊第一個進行查看具體的分析。

該詳情頁面有包含可能的內存浪費分析的,以下圖顯示有重複字符串分析、空集合分析及集合填充率分析等。本應用沒有出現過分使用的空集合及大量低填充率的集合,可是發現有重複字符串的問題。

1551076010286

能夠看到問題描述爲找到了119個char[]實例,其中至少有10個實例具備相同的內容,總大小爲2609832bytes。什麼意思呢,就是重複出現最少十次的char[]共有119個,點擊Detail進行查看具體重複字符串信息。

1551076673404

這裏能夠看到全部的重複char[],若是想看具體的重複信息,選擇Histogram中具體的字符串的連接查看。好比咱們點擊第二個字符串的連接查看,發現字符串中存儲的都是咱們接口的返回值信息。其餘的重複字符串統計也基本是因爲壓測時大量建立對象形成,這裏沒什麼咱們應用內部的問題,能夠繼續分析其餘指標。

1551076799515

(本節詳細分析TODO)也有對象軟弱引用及實現了finalize方法、map集合碰撞率等的分析。關於soft 和 weak 引用咱們大體看一下就OK了,沒什麼問題就能夠,詳細的統計能夠點擊Detail查看。

1551077082159

軟引用統計:這裏有一共2874個軟引用對象。共有21310個對象一共971。9kb被軟引用保留在內存中。

弱引用統計:一共有8905個弱引用對象。共有90個對象一共4。2kb被弱引用保留在內存中。

Finalizer 統計:共有409個對象實現了finalize方法。

Map碰撞率分析:檢測到一個HashMap對象的碰撞率超過了80%。點擊Detail能夠查看應用中各個集合的碰撞率,咱們點開HashMap,以下圖缺失發現了一個對象的碰撞率超過80%,這正是上述統計的那個佔用了344byte的Map。

1551078518047

咱們想看下這個Map裏存儲的是什麼,點擊表中<=0.8的藍色連接。點擊List objects -> with outgoing references能夠查看當前的HashMap中存儲的是什麼。以下圖所示,HashMap中存儲的爲一些TcpEndpoint的對象信息。

1551078769952
相關文章
相關標籤/搜索