Java性能調(diào)優(yōu):利用VisualVM進行性能分析

[Java性能調(diào)優(yōu):利用VisualVM進行性能分析]

JVisualVM 簡介

VisualVM 是Netbeans的profile子項目瘪校,已在JDK6.0 update 7 中自帶,能夠監(jiān)控線程名段,內(nèi)存情況阱扬,查看方法的CPU時間和內(nèi)存中的對 象,已被GC的對象伸辟,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的)麻惶。在JDK_HOME/bin(默認是C:\Program Files\Java\jdk1.6.0_13\bin)目錄下面,有一個jvisualvm.exe文件信夫,雙擊打開窃蹋,從UI上來看,這個軟件是基于NetBeans開發(fā)的了静稻。

VisualVM 提供了一個可視界面警没,用于查看 Java 虛擬機 (Java Virtual Machine, JVM) 上運行的基于 Java 技術(shù)的應用程序的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關(guān)數(shù)據(jù)進行組織振湾,并通過一種使您可以快速查看有關(guān)多個 Java 應用程序的數(shù)據(jù)的方式提供該信息杀迹。您可以查看本地應用程序或遠程主機上運行的應用程序的相關(guān)數(shù)據(jù)。此外押搪,還可以捕獲有關(guān) JVM 軟件實例的數(shù)據(jù)树酪,并將該數(shù)據(jù)保存到本地系統(tǒng)浅碾,以供后期查看或與其他用戶共享。

雙擊啟動 jvisualvm.exe续语,啟動起來后和jconsole 一樣同樣可以選擇本地和遠程垂谢,如果需要監(jiān)控遠程同樣需要配置相關(guān)參數(shù)。

主界面如下疮茄;

image

VisualVM可以根據(jù)需要安裝不同的插件滥朱,每個插件的關(guān)注點都不同,有的主要監(jiān)控GC娃豹,有的主要監(jiān)控內(nèi)存焚虱,有的監(jiān)控線程等。

image

如何安裝:

1懂版、從主菜單中選擇“工具”>“插件”鹃栽。
2、在“可用插件”標簽中躯畴,選中該插件的“安裝”復選框民鼓。單擊“安裝”。
3蓬抄、逐步完成插件安裝程序丰嘉。

我這里以 Eclipse(pid 22296)為例,雙擊后直接展開嚷缭,主界面展示了系統(tǒng)和jvm兩大塊內(nèi)容饮亏,點擊右下方j(luò)vm參數(shù)和系統(tǒng)屬性可以參考詳細的參數(shù)信息.

image

因為VisualVM的插件太多,我這里主要介紹三個我主要使用幾個:監(jiān)控阅爽、線程路幸、Visual GC

監(jiān)控的主頁其實也就是,cpu付翁、內(nèi)存简肴、類、線程的圖表

image

線程和jconsole功能沒有太大的區(qū)別

image

Visual GC 是常常使用的一個功能百侧,可以明顯的看到年輕代砰识、老年代的內(nèi)存變化,以及gc頻率佣渴、gc的時間等辫狼。

image

以上的功能其實jconsole幾乎也有,VisualVM更全面更直觀一些观话,另外VisualVM非常多的其它功能予借,可以分析dump的內(nèi)存快照,

dump出來的線程快照并且進行分析等,還有其它很多的插件大家可以去探索

image

案例分析

準備模擬內(nèi)存泄漏樣例

1灵迫、定義靜態(tài)變量HashMap

2秦叛、分段循環(huán)創(chuàng)建對象,并加入HashMap

代碼如下:

[
復制代碼

](javascript:void(0); "復制代碼")

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">import java.util.HashMap; import java.util.Map; public class CyclicDependencies { //聲明緩存對象
private static final Map map = new HashMap(); public static void main(String args[]){ try {
Thread.sleep(10000);//給打開visualvm時間
} catch (InterruptedException e) {
e.printStackTrace();
} //循環(huán)添加對象到緩存
for(int i=0; i<1000000;i++){
TestMemory t = new TestMemory();
map.put("key"+i,t);
}
System.out.println("first"); //為dump出堆提供時間
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} for(int i=0; i<1000000;i++){
TestMemory t = new TestMemory();
map.put("key"+i,t);
}
System.out.println("second"); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} for(int i=0; i<3000000;i++){
TestMemory t = new TestMemory();
map.put("key"+i,t);
}
System.out.println("third"); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} for(int i=0; i<4000000;i++){
TestMemory t = new TestMemory();
map.put("key"+i,t);
}
System.out.println("forth"); try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("qqqq");
}
}</pre>

[
復制代碼

](javascript:void(0); "復制代碼")

3瀑粥、配置jvm參數(shù)如下:

         -Xms512m
         -Xmx512m
         -XX:-UseGCOverheadLimit
         -XX:MaxPermSize=50m

4挣跋、運行程序并打卡visualvm監(jiān)控

使用JVisualVM分析內(nèi)存泄漏

1、查看Visual GC標簽狞换,內(nèi)容如下避咆,這是輸出first的截圖

        ![image](https://upload-images.jianshu.io/upload_images/17058178-9d22cbf6342fc93f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

這是輸出forth的截圖:

image

通過2張圖對比發(fā)現(xiàn):

image
image

老生代一直在gc,當程序繼續(xù)運行可以發(fā)現(xiàn)老生代gc還在繼續(xù):

image

增加到了7次修噪,但是老生代的內(nèi)存并沒有減少查库。說明存在無法被回收的對象,可能是內(nèi)存泄漏了黄琼。

如何分析是那個對象泄漏了呢樊销?打開抽樣器標簽:點擊后如下圖:

image

按照程序輸出進行堆dump,當輸出second時脏款,dump一次围苫,當輸出forth時dump一次。

進入最后dump出來的堆標簽撤师,點擊類:

image

點擊右上角:“與另一個堆存儲對比”剂府。如圖選擇第一次導出的dump內(nèi)容比較:

image

比較結(jié)果如下:

image

可以看出在兩次間隔時間內(nèi)TestMemory對象實例一直在增加并且多了,說明該對象引用的方法可能存在內(nèi)存泄漏剃盾。

如何查看對象引用關(guān)系呢腺占?

右鍵選擇類TestMemory,選擇“在實例視圖中顯示”痒谴,如下所示:

image

左側(cè)是創(chuàng)建的實例總數(shù)湾笛,右側(cè)上部為該實例的結(jié)構(gòu),下面為引用說明闰歪,從圖中可以看出在類CyclicDependencies里面被引用了,并且被HashMap引用蓖墅。

如此可以確定泄漏的位置库倘,進而根據(jù)實際情況進行分析解決。

JVisualVM 遠程監(jiān)控 Tomcat

 1论矾、修改遠程tomcat的catalina.sh配置文件教翩,在其中增加:
  1. JAVA_OPTS="$JAVA_OPTS

  2. -Djava.rmi.server.hostname=192.168.122.128

  3. -Dcom.sun.management.jmxremote.port=18999

  4. -Dcom.sun.management.jmxremote.ssl=false

  5. -Dcom.sun.management.jmxremote.authenticate=false"

    這次配置先不走權(quán)限校驗。只是打開jmx端口贪壳。

    2饱亿、打開jvisualvm,右鍵遠程,選擇添加遠程主機:

      ![image](https://upload-images.jianshu.io/upload_images/17058178-d7379afa6e2d7383.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    

    3彪笼、輸入主機的名稱钻注,直接寫ip,如下:

      ![image](https://upload-images.jianshu.io/upload_images/17058178-41751fd823bed7a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    右鍵新建的主機配猫,選擇添加JMX連接幅恋,輸入在tomcat中配置的端口即可。
    

    4泵肄、雙擊打開捆交。完畢!

參考資料

https://blog.csdn.net/kl28978113/article/details/53817827

https://www.cnblogs.com/ityouknow/p/6437037.html

原文:https://www.cnblogs.com/xifengxiaoma/p/9402497.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腐巢,一起剝皮案震驚了整個濱河市品追,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冯丙,老刑警劉巖肉瓦,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異银还,居然都是意外死亡风宁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門蛹疯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒财,“玉大人,你說我怎么就攤上這事捺弦∫” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵列吼,是天一觀的道長幽崩。 經(jīng)常有香客問我,道長寞钥,這世上最難降的妖魔是什么慌申? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胡桨。我一直安慰自己廉油,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棉胀。 梳的紋絲不亂的頭發(fā)上法瑟,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音唁奢,去河邊找鬼霎挟。 笑死,一個胖子當著我的面吹牛驮瞧,可吹牛的內(nèi)容都是我干的氓扛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼论笔,長吁一口氣:“原來是場噩夢啊……” “哼采郎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狂魔,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒜埋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后最楷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體整份,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年籽孙,在試婚紗的時候發(fā)現(xiàn)自己被綠了烈评。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡犯建,死狀恐怖讲冠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情适瓦,我是刑警寧澤竿开,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站玻熙,受9級特大地震影響否彩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗦随,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一列荔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚尼,春花似錦肌毅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呜舒。三九已至锭汛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唤殴。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工般婆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朵逝。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓蔚袍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親配名。 傳聞我的和親對象是個殘疾皇子啤咽,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容