當前位置:
首頁 > 知識 > 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

裡面有三種:

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

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

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

三、開始安裝MAT

運行Eclipse,然後單擊菜單欄上「Help=》Install New Software...」

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插件及使用

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

之後單擊「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插件及使用

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插件及使用

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

Eclipse中安裝MemoryAnalyzer插件及使用

3.打開MAT的Perspective

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

Eclipse中安裝MemoryAnalyzer插件及使用

選擇Memory Analysis並確定:

Eclipse中安裝MemoryAnalyzer插件及使用

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

4.打開需要分析的堆轉儲快照.hprof文件

由於MAT是依賴於生成的堆轉儲快照,而不是在運行的時候自動捕獲,因此,再確認進入MAT的工作空間後,點擊"File》Open Heap Dump》選擇剛生成的「java_pid24792.hprof」文件,一直默認就可以查看內存問題的分析圖表以及GC根

Eclipse中安裝MemoryAnalyzer插件及使用

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

a.Histogram:列出每個類的實例列表;

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

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

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

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

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

Eclipse中安裝MemoryAnalyzer插件及使用

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

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

在"default_report org.eclipse.mat.api:suspects"的標籤分頁中

Eclipse中安裝MemoryAnalyzer插件及使用

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

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工具完成的堆棧分析。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

node調用phantomjs-node爬取複雜頁面
關於canvas畫布使用fillRect()時高度出現雙倍效果解決辦法
SQL Server Alwayson創建代理作業注意事項
Bean 的生命周期 之 後處理Bean

TAG:達人科技 |

您可能感興趣

WordPress Simple Social Buttons插件安全漏洞
AMD為macOS版Blender和Maya發布Radeon ProRender插件
IDEA中安裝MongoDB插件-再也無要nosql manager for mongodb
MultiScatter:3ds Max的插件|可與V-Ray和Mental Ray渲染系統配合使用!
解決插件ButterKnife在Library中使用的問題
WordPress登錄頁面美化插件:Login Designer
WordPress怎麼生成sitemap.xml?插件XML Sitemap & Google News
WordPress代碼高亮插件Pure-Highlightjs
WordPress插件YITH WooCommerce Wishlist SQL注入漏洞
唯美逆光ps插件,燈光工廠Knoll Light Factory Photo免費下載
Flow:實用的burp插件;Slingshot APT攻擊
WordPress Plugin AutoSuggest插件SQL注入復現與分析
bootstrap Fileinput插件的使用實例
新型惡意軟體Nigelthorn通過Facebook和Chrome插件傳播
微軟的Unity插件Project Acoustics為VR提供雲端3D音頻
Oculus Unity插件宣布新增Windows MR支持
谷歌Pixel Stand App登陸Google Play商店:優化音樂播放插件
Mac 福音,Radeon ProRender插件Mac測試版來了!
阻止Facebook跟蹤數據的Firefox開源插件Facebook Container
Photoshop詳細解析CameraRaw插件使用