記住下面名詞的解釋:數組
Shallow Heap:表明當前對象佔用的內存空間;
緩存
Retained Heap:表明當前對象被回收後所能釋放的內存空間大小。
異步
一些操做:工具
List objects -> with outgoing references :列出包含哪些對象;
線程
List objects -> with ingoing references :列出被哪些對象包含;
3d
第一行的Regex中均可以填寫過濾表達式快速篩選本身想分析的類。
code
這部分統計了當前堆已使用的總大小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對象,在對象異步入庫後被釋放致使。
這部分表明目前應用中最大的幾個對象的總大小,這部分的數據能夠用來分析應用是否可能發生內存泄漏,留在後面Leak Suspects中介紹。
應用中各個類所佔用內存大小的直方圖,倒序排列
能夠看到NameList類一共有10078個,黑名單和白名單各5000個左右,佔用了241872/1024/1024=0.23M,Retained heap大小爲725624/1024/1024=0.69M,符合預期。
還能夠在第一行的regex裏填寫條件,此時填寫應用的包名,就能夠過濾到目前應用中全部對象佔用的內存大小,以下圖,能夠發現,沒有什麼問題,NameList是黑白名單的緩存信息,其餘的數量都不多。
應用中各個對象佔比,倒序排列,能夠展開某條數據查看其內部具體包含哪些變量及變量的內存佔比。第一行的Regex表達式一樣能夠根據本身的須要進行過濾。
能夠發現系統中目前最大的對象爲SynMap,它是存儲黑白名單的對象,2162040/1024/1024=2.06M,符合預期。
分析應用中資源消耗最高的對象(Biggest Object)、類(Biggest Top-Level Dominator Classes)、類加載器(Biggest Top-Level Dominator Class Loaders)及包(Biggest Top-Level Dominator Packages)。
除了包以外,上面三個統計都有一個餅圖展現結合一個表格展現。好比展開對象的統計信息以下圖所示,同Dominator Tree中統計信息相同。
發現被不一樣類加載器重複加載的類,以下圖所示,發現都是Lambda相關的,無應用中的類,符合預期。
幫助分析應用內存泄漏的工具,結合了餅圖與問題列表的形式展現分析結果,能夠直接點擊問題的Details跳轉到具體的問題中進行分析。
本應用懷疑有三個地方有內存泄漏,第一個和第三個是類加載器及線程組
點擊第二個problem 的detail 進行查看,能夠看到問題詳情頁中包含五個部分:
1.Description(問題描述)
一個名爲SynMap被WebAppClassLoader加載的對象共佔用了2162040 bytes(佔當前已使用內存的10%)。內存累積在 加載器加載的HashMap$Node實例中。
2.Shortest Paths To the Accumulation Point(問題對象到GC根節點的最短路徑)
當前分析出來的問題對象HashMap是用來存儲黑白名單緩存的對象,能夠看到導GC根節點時通過了SynMap,最終被多個Thread使用。因此此處能夠排除非應用中的內存泄漏。
3.Accumulated Objects in Dominator Tree(以當前問題對象爲根的Dominator支配樹)
此處列出了HashMap的支配樹,能夠發現它是被SynMap引用且包含了一個大小爲16384的數組,點擊下圖紅線的節點,從左邊的Attributes中能夠查看其具體的屬性。
4.Accumulated Objects by Class in Dominator Tree(以當前問題對象爲根的Dominator支配樹按類的維度分類統計)
這裏實際上是將上面的支配樹中的對象按類彙總了一下,查看相關類佔用的內存大小。
5.All Accumulated Objects by Class(全部對象按類的維度統計佔用內存分析)
這裏不一樣上面的支配樹中的類統計,是將全部該對象中使用到的類進行了彙總統計。發現Char[]佔用了最大,其次是Date對象,這裏咱們只觀察下大小便可。
展現了大於1%內存的組件
沒有發現跟應用相關的類,咱們能夠點擊第一個進行查看具體的分析。
該詳情頁面有包含可能的內存浪費分析的,以下圖顯示有重複字符串分析、空集合分析及集合填充率分析等。本應用沒有出現過分使用的空集合及大量低填充率的集合,可是發現有重複字符串的問題。
能夠看到問題描述爲找到了119個char[]實例,其中至少有10個實例具備相同的內容,總大小爲2609832bytes。什麼意思呢,就是重複出現最少十次的char[]共有119個,點擊Detail進行查看具體重複字符串信息。
這裏能夠看到全部的重複char[],若是想看具體的重複信息,選擇Histogram中具體的字符串的連接查看。好比咱們點擊第二個字符串的連接查看,發現字符串中存儲的都是咱們接口的返回值信息。其餘的重複字符串統計也基本是因爲壓測時大量建立對象形成,這裏沒什麼咱們應用內部的問題,能夠繼續分析其餘指標。
(本節詳細分析TODO)也有對象軟弱引用及實現了finalize方法、map集合碰撞率等的分析。關於soft 和 weak 引用咱們大體看一下就OK了,沒什麼問題就能夠,詳細的統計能夠點擊Detail查看。
軟引用統計:這裏有一共2874個軟引用對象。共有21310個對象一共971。9kb被軟引用保留在內存中。
弱引用統計:一共有8905個弱引用對象。共有90個對象一共4。2kb被弱引用保留在內存中。
Finalizer 統計:共有409個對象實現了finalize方法。
Map碰撞率分析:檢測到一個HashMap對象的碰撞率超過了80%。點擊Detail能夠查看應用中各個集合的碰撞率,咱們點開HashMap,以下圖缺失發現了一個對象的碰撞率超過80%,這正是上述統計的那個佔用了344byte的Map。
咱們想看下這個Map裏存儲的是什麼,點擊表中<=0.8的藍色連接。點擊List objects -> with outgoing references能夠查看當前的HashMap中存儲的是什麼。以下圖所示,HashMap中存儲的爲一些TcpEndpoint的對象信息。