您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關內存分析工具MAT的使用方法,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
工欲善其事必先利其器,學會使用工具也是一種本領。本篇文章就把自己之前工作中用到的一個內存分析工具給大家介紹下。
內存分析工具MAT(Memory Analyzer Tool)是一款 JVM 的內存分析工具,在實際的工作中可以幫助我們解決生成上內存占用過高等問題。
我之前用 MAT 是在 eclipse上使用,前者是后者的一個插件。后來換到 IDEA 才知道原來 MAT 也有獨立的可運行版本。它的下載地址如下:
http://www.eclipse.org/mat/downloads.php
我們先準備一段簡單的代碼,這個代碼會導致 JVM 堆內存溢出,方便我們演示 MAT 的效果。
public static void main(String[] args) throws InterruptedException {
Map<String,Tom> map = new HashMap<String,Tom>();
int counter = 1;
while(true) {
Thread.sleep(10);
Tom tom = new Tom();
String [] friends = new String[counter];
for (int i = 0; i < friends.length; i++) {
friends[i] = "friends"+i;
}
tom.setAge(counter);
tom.setName("tom"+counter);
tom.setFriends(friends);
map.put(tom.getName(),tom);
if(counter%100==0)
System.out.println("put"+counter);
counter++;
}
}
很好理解的一段代碼,一個無限循環,不斷的往map里添加名為Tom的對象,而且每次循環new出來的對象的friends屬性還在不斷的擴大。
然后我們使用啟動下面這個啟動參數運行代碼,
-Xms200m -Xmx200m -XX:+HeapDumpOnOutOfMemoryError
參數指定了堆內存大小是200m,這個大小我們的測試代碼很快就會用完,然后報錯。
啟動代碼,運行一段時間后報錯如下,
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid1398.hprof ...
Heap dump file created [239632332 bytes in 0.865 secs]
從這個報錯我們可以獲取幾個信息,首先是錯誤類型是內存溢出,原因是超出了GC的限制。
其次,我們看到程序出錯時的內存快照 dump 到了一個名為 java_pid1398.hprof 的文件中了。這個文件就是可以用于 MAT 工具分析的dump文件。
除了上面的通過 -XX:+HeapDumpOnOutOfMemoryError 參數來dump內存文件之外, 還可以通過 jmap 命令來導出的內存快照。這里不做詳述了。
我們現在根據 MAT 的分析,從幾個維度來分析下代碼中的問題。
MAT 工具打開前面的 dump 文件,會先看到下面這種圖,
從預覽圖,可以看到有個應用占用了總的堆內存的大部分,高達184M(程序運行分配的堆內存是200M)。說明這個應用肯定有問題,值得我們繼續往下分析。
我們先看看工具給我們的一個判斷,找到 Leak Suspects,點擊去。
從描述上看到,主線程有個本地變量占用了很大內存,這個變量是 HashMap 的實例。
哈哈,根據上面的代碼,不得不說 MAT 還是很牛叉的,對于內存泄漏點定位的很準確。
不過有時候,我們還是需要手動分析下我們還是回到之前的預覽頁面,找到 Histogram 點進去,如下圖:
shallow heap 指的是對象自身占用的內存大小,不包括它引用的對象。
針對非數組類型的對象,它的大小就是對象與它所有的成員變量大小的總和。當然這里面還會包括一些java語言特性的數據存儲單元。
針對數組類型的對象,它的大小是數組元素對象的大小總和。
我們看到排在前面的是占用內存比較多的,
char[] 這個明顯是String里引用造成的(string里用char[] 存儲數據),我們之間來看String是被誰引用的,
很清晰,Tom對象的friends屬性消耗了很多內存。
這里說明下,
with incoming references 表示的是 當前查看的對象,被外部應用
with outGoing references 表示的是 當前對象,引用了外部對象
同理,我們可以繼續分析下面幾個類,最終都會定位到內存吃緊的原因是 hashmap 里短時間塞了大量的 Tom 對象撐爆了內存。
以上就是內存分析工具MAT的使用方法,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。