天天看點

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

Eclipse中安裝MemoryAnalyzer插件

一、簡介

  Eclipse作為JAVA非常好用的一款IDE,其自帶的可擴充插件非常有利于JAVA程式員的工作效率提升。

  MemoryAnalyzerTool(也叫MAT)是一款JAVA虛拟機記憶體映像分析工具,可以在JAVA程式運作的時候有程式抛出的異常加上已經設定好的參數(-XX:+HeapDumpOnOutOfMemory)調試出記憶體洩漏或者異常的位置以及原因跟蹤,MemeoryAnalyzer可以對Dump出來的堆轉儲快照進行分析,重點是确認記憶體中的對象是否是有必要的,也就是要先确認到底是出現了記憶體洩漏(Memory Leak)還是記憶體溢出(Memory OverFlow)。

二、準備工作

  1.Eclipse IDE:我的是安裝的Eclipse Neon3,大部分版本Eclipse都支援插件安裝。

  名稱:Eclipse Neon

  版本:3

  下載下傳位址:

https://www.eclipse.org/downloads/packages/release/neon/3

(我的是Windows64位的JavaEE版本)

  2.Memory Analyzer Tool(MAT):由于Eclipse支援直接從URL導入包快捷安裝,以及下載下傳壓縮包後導入安裝,下載下傳包在Eclipse官網中能很快找到:

  名稱:Memory Analyzer

  版本:最新版1.7.0.20170613

  官網下載下傳位址:

https://eclipse.org/mat/downloads.php

  裡面有三種:

  1.Eclipse導入的URL,特點:安裝簡單快捷,不需要自己去手動下載下傳,直接輸入URL由Eclipse幫你自動下載下傳;

  2.Eclispe導入的zip,特點:自己下載下傳,當Eclipse自帶工具下載下傳較慢的時候可以使用自己下載下傳然後導入zip即可;

  3.獨立的MemoryAnalyzer工具,特點:自行下載下傳,不依賴于Eclipse的啟動,可直接獨立導入.hprof檔案進行分析。

三、開始安裝MAT

  運作Eclipse,然後單擊菜單欄上“Help=》Install New Software...”

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  進入軟體源導入界面,你可以選擇使用URL直接導入,URL導入的位址為:

http://download.eclipse.org/mat/1.7/update-site/      

  但是由于鏡像連接配接不穩定性,我使用的是下載下傳壓縮包zip然後安裝,壓縮包下載下傳位址為:

http://ftp.jaist.ac.jp/pub/eclipse/mat/1.7/MemoryAnalyzer-1.7.0.201706130745.zip

  下載下傳完成之後将其導入,"Add》Archive》選擇你下載下傳好的zip檔案》OK":

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  确定之後勾選"Memory Analyzer for Eclipse IDE"下面的兩項即可,這個是用于Eclipse内部使用的插件,下面一個“Stand-alone Memory Analyzer“是獨立的分析工具,一般不用勾選。

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  之後單擊“Next"等待一段時間Eclipse計算的需求和依賴檔案下載下傳完畢後,一路"next",并接受協定“Finish”即可完成安裝,重新開機Eclispe後就可以使用MAT了。

四、MAT的簡單使用

1.設定JVM參數

  JVM的參數可以用于調試JVM在各種限制條件下的常見BUG,一下簡單介紹幾個參數:

-XX:+HeapDumpOnOutOfMemoryError    //虛拟機在堆異常時生成對存儲快照,字尾一般是.hprof
-Xms    //Java堆的最小值,例如-Xms20m,将Java堆的最小值設定為20MB
-Xmx    //Java堆的最大值,例如-Xms40m,将Java堆的最大值設定為40MB      

  了解了參數之後,可以對參數進行一定的設定,以便我們簡單的對MAT工具進行使用測試,設定參數如下:

-XX:+HeapDumpOnOutOfMemoryError
-Xms20m
-Xmx20m      

  之是以将最小和最大的堆設定為一樣是為了能避免堆的自動擴充,以及20MB的空間是為了讓程式能盡快的占滿使得記憶體溢出。

  設定JVM的啟動參數可在“Run》Run Configuration》Arguments》Vm arguments”中填寫

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

2.編寫記憶體溢出(Memory Leak)代碼

  思路:通過建立集合清單List,然後以while(true)死循環的方式使得List集合不斷添加新的對象,使得其不斷地占滿堆空間

  代碼:

package com.study;

import java.util.ArrayList;
import java.util.List;

public class TestStudy {

    static class OOMClass { }
    
    public static void main(String[] args) {
        List<OOMClass> list = new ArrayList<OOMClass>();
        while(true) {
            list.add(new OOMClass());
        }
    }

}      

  執行代碼,發現輸出如下:

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  注意到“java_pid24792.hprof”檔案,這個檔案是JVM生成的對存儲快照,之後可以通過MAT工具打開,進行分析追蹤,這個檔案将自動儲存到你的Eclipse workspace下的工作目錄中,以我的為例:

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

3.打開MAT的Perspective

  由于MAT工具需要另外打開一個工作視圖(就像Eclipse EE和Java的切換視圖一樣),是以需要在先配置打開"Window》Perspective》Open Perspective》Other...":

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  選擇Memory Analysis并确定:

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  完後之後将進入MAT的工作空間視圖,你可以在Eclipse右上角進行切換回Java或者EE,由于接下來要使用MAT分析,是以就暫時不切回之前的Java了

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

4.打開需要分析的堆轉儲快照.hprof檔案

  由于MAT是依賴于生成的堆轉儲快照,而不是在運作的時候自動捕獲,是以,再确認進入MAT的工作空間後,點選"File》Open Heap Dump》選擇剛生成的“java_pid24792.hprof”檔案,一直預設就可以檢視記憶體問題的分析圖表以及GC根

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  你可以進行一些分析操作,可以看到Action下的幾個選項:

  a.Histogram:列出每個類的執行個體清單;

  b.Dominator:列出最大的對象和他們存在的東西;

  c.Top Comsumer:列印按類和包分組的最昂貴的對象;

  d.Duplicate Classes:檢測由多個類加載器加載的類。

5.使用MAT找出問題存在的對象

  由于是一個簡單的問題,是以我們直接選擇Dominator,可以直接以百分比的形式列印出對象所占的百分比,一般的記憶體溢出大部分情況都是有某一個對象過多存在而未被GC回收導緻,是以可以點開最大百分比的類一級級找,不難找到問題所在:

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  可以看到列出額其中的25條,還有810300條目未列出,這81萬個對象占據了97.36%的堆空間,是以不難發現是OOMClass類的對象生成過多為未被回收導緻記憶體溢出。

6.進一步追蹤問題源并進行定位

  在"default_report org.eclipse.mat.api:suspects"的标簽分頁中

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  在"Program Suspect 1》Details"點選後找到"Thread Stack"中追蹤出錯點

Eclipse中安裝MemoryAnalyzer插件及使用Eclipse中安裝MemoryAnalyzer插件

  看到出錯點在第13行,找到對應的Java代碼TestStudy的13行:

1 package com.study;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class TestStudy {
 7 
 8     static class OOMClass { }
 9     
10     public static void main(String[] args) {
11         List<OOMClass> list = new ArrayList<OOMClass>();
12         while(true) {
13             list.add(new OOMClass());
14         }
15     }
16 
17 }      

  找到了追蹤的出錯位置,以上就是使用Memory Analyzer工具完成的堆棧分析。

作者:

letcafe

出處:

http://www.cnblogs.com/letcafe/

-------------------------------------------

個性簽名:程式設計水太深,先會造輪子!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,部落客在此感謝!

繼續閱讀