如何利用JConsole觀察分析Java程序的運(yùn)行并進(jìn)行排錯(cuò)調(diào)優(yōu)
一、JConsole是什么
從Java 5開(kāi)始 引入了 JConsole。JConsole 是一個(gè)內(nèi)置 Java 性能分析器,可以從命令行或在 GUI shell 中運(yùn)行。您可以輕松地使用 JConsole(或者,它更高端的 “近親” VisualVM )來(lái)監(jiān)控 Java 應(yīng)用程序性能和跟蹤 Java 中的代碼。
二、如何啟動(dòng)JConsole
1.如果是從命令行啟動(dòng),使 JDK 在 PATH 上,運(yùn)行 jconsole 即可。
2.如果從 GUI shell 啟動(dòng),找到 JDK 安裝路徑,打開(kāi) bin 文件夾,雙擊 jconsole 。
當(dāng)分析工具彈出時(shí)(取決于正在運(yùn)行的 Java 版本以及正在運(yùn)行的 Java 程序數(shù)量),可能會(huì)出現(xiàn)一個(gè)對(duì)話框,要求輸入一個(gè)進(jìn)程的 URL 來(lái)連接,也可能列出許多不同的本地 Java 進(jìn)程(有時(shí)包含 JConsole 進(jìn)程本身)來(lái)連接。如圖所示:

想分析那個(gè)程序就雙擊那個(gè)進(jìn)程。
三、如何設(shè)置JAVA程序運(yùn)行時(shí)可以被JConsolse連接分析
1.本地程序(相對(duì)于開(kāi)啟JConsole的計(jì)算機(jī)),無(wú)需設(shè)置任何參數(shù)就可以被本地開(kāi)啟的JConsole連接(Java SE 6開(kāi)始無(wú)需設(shè)置,之前還是需要設(shè)置運(yùn)行時(shí)參數(shù) -Dcom.sun.management.jmxremote )
2.無(wú)認(rèn)證連接 (下面的設(shè)置表示:連接的端口為8999、無(wú)需認(rèn)證就可以被連接)
-Dcom.sun.management.jmxremote.port=8999 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false
3.如果考慮到安全因素,需要認(rèn)證,需要安全連接,也是可以搞定的。參考:http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenv
四、JConsole如何連接遠(yuǎn)程機(jī)器的JAVA程序(舉例說(shuō)明)
1、寫(xiě)一個(gè)簡(jiǎn)單的一直運(yùn)行的JAVA程序,運(yùn)行在某臺(tái)機(jī)器上如(192.168.0.181)
java -cp . -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.managent.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false JConsoleTest
2、另外一臺(tái)機(jī)器進(jìn)行連接
可以直接使用命令:
jconsole.exe 192.168.0.181:8999
也可以在已經(jīng)打開(kāi)的JConsole界面操作 連接->新建連接->選擇遠(yuǎn)程進(jìn)程->輸入遠(yuǎn)程主機(jī)IP和端口號(hào)->點(diǎn)擊“連接”,如圖:

然后就會(huì)進(jìn)入分析界面:
性能分析
下面說(shuō)說(shuō)如何分析,如何使用這六個(gè)標(biāo)簽
• 概述: Displays overview information about the Java VM and monitored values.
• 內(nèi)存: 顯示內(nèi)存使用信息
• 線程: 顯示線程使用信息
• 類: 顯示類裝載信息
•*VM摘要:*顯示java VM信息
• MBeans: 顯示 MBeans.
然后就會(huì)進(jìn)入分析界面:
概述

概述很簡(jiǎn)單沒(méi)啥說(shuō)的,自己看看吧,不過(guò)值得一提的是對(duì)著圖點(diǎn)擊右鍵可以保存數(shù)據(jù)到CSV文件,以后可以使用其他工具來(lái)分析這些數(shù)據(jù)。

這個(gè)比較有價(jià)值,參看堆內(nèi)存,非堆內(nèi)存,內(nèi)存池的狀況總體內(nèi)存的分配和使用情況以及不同的GC進(jìn)行垃圾回收的次數(shù)和時(shí)間??梢允謩?dòng)進(jìn)行GC查看內(nèi)存變化。
在分析JAVA內(nèi)存問(wèn)題進(jìn)行調(diào)優(yōu)時(shí)候非常有用,你要學(xué)習(xí)JVM內(nèi)存模型,之后會(huì)發(fā)現(xiàn)這里的每個(gè)值都具有意義。
GC的算法和參數(shù)對(duì)性能有顯著的影響,注意垃圾回收次數(shù)、時(shí)間、以及partial GC和full GC,調(diào)整你所使用的不同GC和以及各個(gè)GC下的參數(shù),然后在這個(gè)視圖下觀察,以得到好的性能。
這里貼一下 Java HotSpot VM garbage collector 下generational GC 的各代的劃分圖:

關(guān)于GC,可以參考:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

左下角顯示所有的活動(dòng)線程(如果線程過(guò)多,可以在下面的過(guò)濾欄中輸入字符串過(guò)濾出你想要觀察的線程)。點(diǎn)擊某個(gè)顯示會(huì)顯示這個(gè)線程的名稱、狀態(tài)、阻塞和等待的次數(shù)、堆棧的信息。
統(tǒng)計(jì)圖顯示的是線程數(shù)目的峰值(紅色)和當(dāng)前活動(dòng)的線程(藍(lán)色)。
另外下面有個(gè)按鈕“檢測(cè)到死鎖”,有時(shí)候會(huì)有用處。
類

沒(méi)啥要說(shuō)的。

也沒(méi)啥要說(shuō)的,看看吧,內(nèi)存狀況,操作系統(tǒng)...

這里可以有一些額外的操作。
jconsole -pluginpath C:\Java\jdk1.6.0_22\demo\management\JTop\JTop.jar

一看便知,是個(gè)什么東西。
推薦使用升級(jí)版 JConsole 即 jvisualvm 。
關(guān)于jvisualvm的使用,-> http://www.dhdzp.com/article/77131.htm
參考資料:
- Monitoring and Management Using JConsole :http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
- http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html Monitoring and Management Using JMX Technology :http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html
- Eclipse launcher for VisualVM : http://visualvm.dev.java.net/eclipse-launcher.html
- Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine : http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
相關(guān)文章
SpringBoot2基于重復(fù)創(chuàng)建bean的問(wèn)題及解決
這篇文章主要介紹了SpringBoot2基于重復(fù)創(chuàng)建bean的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
springboot如何讀取application.yml文件
這篇文章主要介紹了springboot如何讀取application.yml文件的方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-12-12
Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF
FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。本文主要介紹了在Java中如何基于FFmpeg進(jìn)行Mp4視頻到Gif動(dòng)圖的轉(zhuǎn)換,感興趣的小伙伴可以了解一下2022-11-11
spring-mybatis與原生mybatis使用對(duì)比分析
這篇文章主要介紹了spring-mybatis與原生mybatis使用對(duì)比分析,需要的朋友可以參考下2017-11-11
Java下載文件時(shí)文件名亂碼問(wèn)題解決辦法
我最近在開(kāi)發(fā)時(shí)遇到了文件另存為時(shí)文件名出現(xiàn)亂碼,在火狐上正常的文件名,在IE中又出現(xiàn)亂碼問(wèn)題,然后好不容易在IE下調(diào)試好了文件名亂碼問(wèn)題,在火狐下又出現(xiàn)亂碼,最后終于感覺(jué)這樣是能解決了。具體如下:2013-04-04
java實(shí)現(xiàn)oracle插入當(dāng)前時(shí)間的方法
這篇文章主要介紹了java實(shí)現(xiàn)oracle插入當(dāng)前時(shí)間的方法,以實(shí)例形式對(duì)比分析了java使用Oracle操作時(shí)間的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
劍指Offer之Java算法習(xí)題精講排列與N叉樹(shù)
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03

