jconsole工具使用


Jconsole,Java Monitoring and Management Console。

Jconsole是JDK自帶的監控工具,在JDK/bin目錄下可以找到。它用於連接正在運行的本地或者遠程的JVM,對運行在java應用程序的資源消耗和性能進行監控,並畫出大量的圖表,提供強大的可視化界面。而且本身占用的服務器內存很小,甚至可以說幾乎不消耗。

 

一、介紹

JConsole 是一個內置 Java 性能分析器,可以從命令行(直接輸入jconsole)或在 GUI shell (jdk\bin下打開)中運行。

它用於對JVM中內存,線程和類等的監控。可使用JTop插件。它可以監控本地的jvm,也可以監控遠程的jvm,也可以同時監控幾個jvm。 

這款工具的好處在於,占用系統資源少,而且結合Jstat,可以有效監控到java內存的變動情況,以及引起變動的原因。在項目追蹤內存泄露問題時,很實用。 

 

使用 JConsole 進行工作

分析器有自己的開銷,因此最好的辦法就是花點時間來弄清是什么開銷。發現 JConsole 開銷最簡單的辦法是,首先獨自運行一個應用程序,然后在分析器下運行,並測量差異。(應用程序不能太大或者太小;我最喜歡使用 JDK 附帶的 SwingSet2 樣本。)因此,我使用 -verbose:gc 嘗試運行 SwingSet2 來查看垃圾收集清理,然后運行同一個應用程序並將 JConsole 分析器連接到它。當 JConsole 連接好了之后,一個穩定的 GC 清理流出現,否則不會出現。這就是分析器的性能開銷。

 

二、遠程監控

因為 Web 應用程序分析工具假設通過一個套接字進行連通性分析,只需要進行少許配置來設置 JConsole(或者是基於 JVMTI 的分析器,就這點而言),監控/分析遠程運行的應用程序。

遠程監控與本地監控配置類似,這里以監控遠程為例。

 

1、監控tomcat 

服務器端:

詳細步驟如下所示:

復制代碼

1、  vi catalina.sh

找到# OS specific support. $var _must_ be set to either true or false.添加如下變量: 

JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9999

-Dcom.sun.management.jmxremote.authenticate=true

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

-Djava.rmi.server.hostname=192.168.56.253

-Dcom.sun.management.jmxremote.acccess.file=/usr/local/tomcat/bin/jconsole/jmxremote.access

-Dcom.sun.management.jmxremote.password.file=/usr/local/tomcat/bin/jconsole/jmxremote.password"

 

2、  切換用戶到root,修改/etc/hosts添加IP地址。

添加如下信息: 
增加192.168.56.253 localhost

 

Hostname -i

3、編輯jmxremote.access和jmxremote.password

這兩個文件是在JDK里面的,可以通過%JAVA_HOME%/jre/lib/management目錄找到。里面有個jmxremote.password.template文件,將其重命名為jmxremote.password,這就是控制遠程連接的用戶名密碼的。

 

find . -name "jmxremote.password.template" -print ./usr/lib/jvm/java/jre/lib/management/jmxremote.password.template

$JAVA_HOME=/usr/lib/jvm/java/

 

#mkdir -p $JAVA_HOME/jconsole 
#cp $JAVA_HOME/jre/lib/management/jmxremote.password.template $JAVA_HOME/jconsole/jmxremote.password 
#cp $JAVA_HOME/jre/lib/management/jmxremote.access $JAVA_HOME/jconsole/jmxremote.access
修改文件權限: 
#chmod -R 600 jconsole 


此時提示錯誤: 必須限制口令文件讀取訪問: $JAVA_HOME/jconsole/jmxremote.password。 
解決辦法:在$CATALINA_BASE(/tomcat/bin/)目錄下新建jconsole文件夾,訪問文件權限必須是600 
#mkdir -p $CATALINA_BASE/jconsole 
復制jmxremote.password、jmxremote.access到$CATALINA_BASE/jconsole,修改文件權限 
#chmod -R 600 jmxremote.password 
#chmod -R 600 jmxremote.access 

然后chmod對這兩個文件賦權,600就可以了。

最后vi jmxremote.password,修改下面兩行,把注釋#去掉:

# monitorRole  XXXXXX
# controlRole  XXXXXX

 

 monitorRole  QED

 controlRole   R&D

 

4、  編輯 /etc/sysconfig/ iptables.old

增加一行:

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 9999 -j ACCEPT

COMMIT

 

查看端口是否被使用:netstat -apn|grep 9999

 

5、$CATALINA_BASE/bin/shutdown.sh.出現連接端口被占用提示。 
ps -ef | grep 1090 --被占用端口 
kill -9 pid 
重啟Tomcat.$CATALINA_BASE/bin/startup.sh 
jconsole 遠程連接(使用192.168.56.253:9999   controlRole R&D連接)

復制代碼

 

修改catalina.sh時,也可以將其設置為無密碼訪問,如:

 CATALINA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.116.111 
-Dcom.sun.management.jmxremote.port=9527
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"

 

客戶端:

已成功安裝jdk1.5以上版本。在命令行下啟動jconsole,選擇遠程進程,輸入ip:port,用戶名與密碼,即可監控tomcat的jvm。

 

2、可能無法連接原因

從windows連接到linux時(centos5.4)時,老是連接不上)。原因是Linux上JVM給jconsole的RMI配置文件不對,
jvm使用了hostname -i的IP地址,我的/etc/hosts上127.0.0.1,所以遠程老是連接不上。
只要在java啟動參數中加入 -Djava.rmi.server.hostname=192.168.0.10  顯示說明JVM返回給jconsole的IP地址即可。
JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote.port=1011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.210"

 

 

2、監控was

http://xjsunjie.blog.51cto.com/999372/1331880

三、使用簡介

當Jconsole連接成功后,它從JMX獲取信息,我們便可以在里面監控具體的內容。
Jconsole能捕獲到以下信息:

  1. 概述 - JVM概述和一些監控變量的信息
  2. 內存 - 內存的使用信息
  3. 線程 - 線程的使用信息
  4. 類 - 加載java類的信息
  5. VM - JVM摘要
  6. MBeans - 所有MBeans的信息

性能測試過程中需要關注哪些信息呢?一般主要關注內存欄、線程欄、類欄,概述欄和VM欄次之,MBeans欄在追蹤具體問題時用到。

 

隨時可以使用JConsole的在右上角的綠色連接狀態圖標,斷開或重新連接到正在運行的Java虛擬機。 從下拉菜單中選擇連接,然后新建連接,您可以同時連接到任何數量運行中的Java虛擬機。

以下以本地監控jconsole進程為例講解。

1、 查看概述信息

概述選項卡中顯示CPU使用率,內存使用率,線程數,Java VM中加載的類的監控信息。

圖3-1概述“選項卡

 

“概述”選項卡提供了一種簡單的方法相關的信息,以前只能通過多個選項卡之間切換。

保存圖表數據

JConsole的,可以讓您保存在一個逗號分隔值(CSV)文件中的圖表提供的數據。 為了節省從圖表中的數據,只需右鍵單擊任何圖表上, 選擇保存數據,然后指定其中的數據將被保存的文件。 從任何任何JConsole的不同的標簽以這種方式顯示的圖表,您可以保存數據。

CSV格式是常用的電子表格應用程序之間的數據交換。 CSV文件可以導入到電子表格應用程序,可以用來創建這些應用程序的圖表。 這些數據是兩個或多個命名的列,第一列表示的時間戳。 導入電子表格應用程序的文件后,你通常需要選擇的第一列,並改變其格式為“日期”或“日期/時間”。

 

2、監控內存消耗

Memory選項卡提供了內存消耗和內存池的信息。

圖3-2內存“選項卡

 

圖3-3內存“選項卡

 

圖3-2,3-3顯示都沒有問題,只是監控的進程不同而有所區別。非堆內存顯示區域不同。

內存標簽功能“執行GC”的按鈕,可以單擊執行垃圾收集。 圖表動態顯示內存使用的堆和非堆內存的內存池。 可用的內存池取決於正在使用的版本的Java VM。 串行垃圾回收的內存池的HotSpot Java虛擬機,有以下幾種。

  • 伊甸園空間(堆):大多數對象最初分配內存的池。
  • 生存空間(堆):包含伊甸園空間垃圾收集后生存的對象。
  • 年老代(堆):池包含已經存在一段時間的對象。
  • 永久代(非堆):池包含的所有虛擬機本身的反射的數據,如類和方法的對象。 Java虛擬機,使用類數據共享,這一代分為只讀和讀寫區域。
  • 代碼緩存(非堆):HotSpot Java虛擬機的還包括一個代碼緩存,包含內存,使用本機代碼的編譯和存儲。

可以從圖表下拉菜單中的選項選擇不同的圖表顯示圖表這些內存池的消費。 此外,點擊在右下角的角落堆和非堆圖標,將切換顯示圖表(與下拉框選擇不同類型圖表功能相同)。 最后,可以指定跟蹤內存使用情況,從時間范圍內的下拉菜單中的選項選擇的時間范圍。

欲了解更多有關這些內存池的信息,請參閱下面的垃圾收集。

“詳細信息”區域顯示了當前內存信息:

  • 已使用:目前使用的內存量,包括所有對象,可達和不可達占用的內存。
  • 分配 :保證由Java虛擬機使用的內存量。 提交的內存量可能會隨時間而改變。 Java虛擬機可能會釋放系統內存,並已提交的內存量可能會少於最初啟動時分配的內存量。 提交的內存量將始終大於或等於使用的內存量。
  • 最大值,可用於內存管理的最大內存量。 它的價值可能會發生變化,或者是不確定的。 如果Java虛擬機試圖增加使用的內存要大於提交的內存,內存分配可能失敗,即使使用量小於等於最大值(例如,當系統上的虛擬內存不足)。
  • GC時間 :累計時間花在垃圾收集和調用的總數。 它可能有多個行,其中每一個代表一個垃圾收集器算法在Java虛擬機使用時間。
    MarkSweepCompact:年輕代GC
    Scavenge:full GC

GC時會暫停整個JAVA應用,普通GC 只是對年輕代進行垃圾回收,full的GC會對整個堆內存(包含老年代、年輕代)進行垃圾回收。system的GC顯示調用GC。

full gc 只會在兩個情況下發生:1)system.gc被顯示調用時,會執行full gc。2)老年代的堆內存滿時,會執行full gc。
 

較低的右側的條形圖顯示堆和非堆內存中的內存池消耗的內存。 列會變成紅色時,使​​用的內存超過了內存使用閥值。

堆和非堆內存

Java虛擬機管理兩種內存:堆和非堆內存,這兩者都是Java虛擬機啟動時創建的。

  • 堆內存是運行時數據區域,Java VM的所有類實例和數組分配內存。 可能是固定或可變大小的堆。
  • 非堆內存包括在所有線程和Java虛擬機內部處理或優化所需的共享的方法。 它存儲了類的結構,運行常量池,字段和方法數據,以及方法和構造函數的代碼,方法區在邏輯上是堆的一部分,看具體實現的方式。根據實現方式的不同,Java虛擬機可能不進行垃圾收集或壓縮。 堆內存一樣,方法區域可能是一個固定或可變大小。 方法區的內存不需要是連續的。

除了方法區,Java虛擬機可能需要進行內部處理或優化,這也屬於非堆內存的內存。 例如,實時(JIT)編譯器需要內存用於存儲從Java虛擬機的高性能的代碼翻譯的機器碼。

 

內存池和內存管理器

內存池和內存管理器是Java虛擬機的內存系統的關鍵環節。

  • 一個內存池表示Java虛擬機管理的內存區域。 Java虛擬機至少有一個內存池,它可能在執行過程中創建或刪除內存池。 一個內存池可以屬於堆或以非堆內存。
  • 一個內存管理器管理一個或多個內存池。 垃圾收集器是一個負責回收不可達的對象使用的內存的內存管理器。 Java虛擬機可能有一個或更多的內存管理器。 在執行過程中,它可以添加或刪除內存管理器。 一個內存池可以由一個以上的內存管理器進行管理。

垃圾收集

垃圾收集(GC)是Java虛擬機如何釋放不再被引用的對象所占用的內存。 它通常認為的對象,有作為“活着”和非引用作為或不可達對象的活動引用“死。” 垃圾收集是由死對象占用的的內存釋放過程。 氣相色譜法的算法和使用的參數可以對性能有巨大影響。

Java HotSpot虛擬機的垃圾收集器使用代GC。 代GC的優勢,大多數都符合以下的概括。

  • 他們創建有許多短暫的一生對象,例如,迭代和局部變量。
  • 他們創建一些對象,有很長的生活,例如,高層次的持久對象。

代GC分為幾代,並給每個指定一個或多個內存池。 當一代使用了分配的內存,虛擬機上執行一個局部的GC(也叫minor collection),內存池回收死對象使用的內存。 這部分的GC速度通常遠遠優於一個完整的GC。

Java HotSpot虛擬機定義了兩代:年輕代(有時也被稱為“托兒所”)和年老代。 年輕代包括“伊甸園空間”和兩個“生存空間”。 最初,VM將所有的對象在“伊甸園”空間,大多數對象死在那里。 當它執行了一次minor GC,VM將剩余的對象從“伊甸園空間”轉移到“生存空間”。 虛擬機將足夠長生存時間的對象移動到年老代的空間。 當年老代填滿了,將是一個完整的GC,往往是慢得多,因為它涉及到所有存活的對象。 永久代包含所有的虛擬機本身的反射,如類和方法的對象的數據。

默認情況下代安排看起來像圖3-4。

圖3-4代的數據,在垃圾收集

如果垃圾收集器已經成為一個瓶頸,你可以通過自定義代大小來提高性能。 使用JConsole,你可以調查你的性能指標的敏感性實驗與垃圾收集器的參數。 欲了解更多信息,請參閱調整與5.0 HotSpot虛擬機的垃圾收集,http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html。

3、監視線程使用

線程“選項卡上提供了有關線程使用的信息。

圖3-5 Threads選項卡

在左下角的“線程”列表列出了所有的活動線程。 如果你輸入一個“過濾器”字段中的字符串,線程列表將只顯示其名稱中包含你輸入字符串線程。 點擊一個線程在線程列表的名稱,顯示該線程的信息的權利,包括線程的名稱,狀態、阻塞和等待的次數、堆棧跟蹤。

圖表顯示活動線程的數量隨着時間的推移。 兩行顯示。

  • 紅色 :峰值線程數
  •  :活動線程數。

線程選項卡提供了幾個有用的操作。

  • findMonitorDeadlockedThreads:檢測,如果任何線程對象監視器鎖定陷入死鎖。 此操作返回一個死鎖的線程ID數組。
  • getThreadInfo:返回線程的信息。 這包括名稱,堆棧跟蹤和監測鎖,該線程目前已封鎖,如果有的話,哪個線程持有該鎖,以及線程爭用統計。
  • getThreadCpuTime:返回給定的線程所消耗的CPU時間

通過MBeans選項卡,您可以通過選擇的MBean樹中的線程MXBean的這些附加功能。 這MXBean的訪問被監視的Java虛擬機線程信息列出所有的屬性和操作。 請參閱監視和管理的 MBean 。

檢測死鎖線程

要檢查如果您的應用程序已經陷入了僵局運行(例如,您的應用程序似乎是掛了),死鎖的線程可以通過點擊“檢測死鎖”按鈕檢測。 如果檢測到任何死鎖的線程,這些都顯示在一個新的標簽,旁邊出現的“主題”標簽, 在圖 3-6所示。

圖3-6僵持主題

檢測死鎖“按鈕,將涉及對象監視器和 java.util.concurrent的可擁有同步器(見API 規范文檔java.lang.management.LockInfo)檢測死鎖循環。 Java SE 6中已加入的java.util.concurrent鎖的監控支持。 如果JConsole的連接到一個J2SE 5.0 VM,檢測死鎖機制只會找到相關的對象監視器死鎖。 jconsole會不顯示任何相關的可擁有同步器的死鎖。

關於線程和守護線程的詳細信息, 參見API文檔的java.lang.Thread。

 

4、監視類載入中

“類”標簽顯示關於類加載的信息。

圖3-7類標簽

圖表曲線加載的類的數量隨着時間的推移。

  • 紅線總數(包括后來卸載的)加載的類。
  • 藍線是當前的類加載。

在選項卡底部的詳細信息部分顯示類的加載,因為Java虛擬機開始的總數,當前加載和卸載的數量。 跟蹤類加載詳細的輸出,您可以勾選在頂部的右上角復選框。

查看VM信息

VM摘要“選項卡提供了對Java虛擬機的信息。

圖3-8虛擬機摘要選項卡

在此選項卡中提供的信息包括以下內容。

  • 摘要
    • 運行時間 :開始以來,Java虛擬機的時間總額。
    • 進程的CPU時間 :Java VM的開始,因為它消耗的CPU時間總量。
    • 編譯總時間 :累計時間花費在JIT編譯。
  • 主題
    • 活動線程 :目前現場守護線程,加上非守護線程數量。
    • 峰值 :活動線程的最高數目,因為Java虛擬機開始。
    • 守護線程 :當前的活動守護線程數量。
    • 總線程 :開始自Java虛擬機啟動的線程總數,包括非守護進程,守護進程和終止的線程。
    • 當前類裝載 :目前加載到內存中的類數目。
    • 總類加載 :從Java VM開始加載到內存中的類總和,包括那些后來被卸載的類。
    • 已卸載類總數 :從Java虛擬機開始從內存中卸載的類的數目。
  • 內存
    • 當前的堆大小 :目前所占用的堆的千字節數。
    • 分配的內存 :堆分配的內存總量。
    • 最大堆最大值 :堆所占用的千字節的最大數目。
    • 待最后確定的對象:待最后確定的對象的數量。
    • 花在執行GC的垃圾收集器 :包括垃圾收集,垃圾收集器的名稱,進行藏品的數量和總時間的信息。
  • 操作系統
    • 總物理內存
    • 空閑物理內存
    • 分配的虛擬內存
  • 其他信息
    • VM參數 :輸入參數的應用程序通過Java虛擬機,不包括的主要方法的參數。
    • 類路徑是由系統類加載器用於搜索類文件的類路徑。
    • 庫路徑 :加載庫時要搜索的路徑列表。
    • 引導類路徑 :引導類路徑是由引導類加載器用於搜索類文件。

 

5、監控和​​管理的MBean

MBeans選項卡顯示的信息平台MBean服務器中的一個通用的方法對所有已注冊的MBean。 MBeans選項卡允許您訪問平台MXBean。 此外,您還可以監控和管理您的應用程序的MBean。

圖3-9 MBeans選項卡

左側的樹顯示當前正在運行的所有MBean。 當您選擇樹中的一個MBean,  MBeanInfo及其MBean描述符都顯示在右側,並在它下面的樹中出現的任何屬性,操作或通知。

所有平台MXBean和各種操作和屬性是通過JConsole的MBeans選項卡訪問。

構建MBean的樹

默認情況下,基於對象的名稱樹中示MBean。jconsole會使用確切的鍵屬性列表構建MBean樹,構建時調用ObjectName.getKeyPropertyListString()方法返回類型的第一個key,和j2eeType的第二個key,如果存在的話。

然而,依靠ObjectName的關鍵屬性的默認順序,有時可以導致意外的結果。例如,如果兩個對象的名字也有類似的key,但其key的排序不同,那么相應的MBean將不會在MBean樹相同的節點下創建。

例如,假設您創建具有下列名稱的三角MBean的對象。

com.sun.example:type=Triangle,side=isosceles,name=1
com.sun.example:type=Triangle,name=2,side=isosceles
com.sun.example:type=Triangle,side=isosceles,name=3

至於JMX技術而言,這些對象將被視為在完全一樣的方式。在對象名稱的鍵的順序不作任何JMX技術的差異。但是,如果JConsole連接這些MBean,並使用默認的MBean樹渲染,那么對象com.sun.example:type=Triangle,name=2,side=isosceles最終會被節點Triangle下創建,在一個節點2,將包含一個子節點稱為isosceles。其他兩個isosceles,name= 1 name= 3,將分設在不同的節點isosceles下,如圖3-10所示。

圖3-10意外的MBean樹渲染范例

您可以指定MBean提供一個有序的鍵屬性列表來避免這個問題。當你在命令行啟動JConsole時,通過設置系統屬性com.sun.tools.jconsole.mbeans.keyPropertyList:

% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=key[,key]*

鍵屬性列表需要一個逗號分隔,在您所選擇的, key的地方必須是一個字符串,代表一個對象的名稱鍵或一個空字符串的順序。 如果在列表中指定的一個key並不適用於一個特定的MBean,那么該key將被丟棄。bjectName.getKeyPropertyListString()返回值定義的鍵的順序,將用於完成 keyPropertyList定義的鍵順序。 因此,指定一個空的鍵列表僅僅意味着jconsole會顯示MBean的ObjectName的鍵。

因此,返回到上面提到的例子,你可以選擇指定的keyPropertyList系統屬性啟動JConsole:

% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=side,name

JConsole中會產生的MBean樹如圖 3-11所示。

圖3-11范例的MBean樹構造使用keyPropertyList

在圖3-10中side第一,name第二。 因為type不是在指定的鍵屬性列表類型的key,因此MBean樹算按默認次序排序。

根據公約所定義的JMX最佳實踐准則的對象的名稱, 類型的關鍵應該永遠是第一位的。 因此,要尊重本公約應從以下系統屬性JConsole的。

 %JConsole的- J - Dcom.sun.tools.jconsole.mbeans.keyPropertyList =type,side,name

上面的命令將導致JConsole的渲染如圖3-12中所示

圖3-12范例的MBean樹尊重JMX的最佳實踐構建

這顯然遠遠超過難理解的圖3-10和圖3-11中顯示的MBean的樹。

MBean屬性

選擇“屬性”節點顯示一個MBean的所有屬性,圖3-13顯示了Threading的所有屬性。

圖3-13查看所有的MBean屬性

選擇單個MBean屬性,  MBeanAttributeInfo,會顯示在右窗格中,如圖3-14。

圖3-14查看單個的MBean屬性

您可以通過雙擊右側窗體中粗體文本顯示更多信息。 例如,如果你點擊HeapMemoryUsage 對應的value值,你會看到一個圖表:圖3-15 。

圖3-15顯示的屬性值

雙擊數字屬性值將顯示一個圖表,圖,數值的變化。 例如,雙擊上的垃圾收集器的MBean 的PS Marksweep CollectionTime屬性,將顯示執行垃圾收集所花費的時間。

您還可以使用JConsole設置可寫屬性的值。 一個可寫的屬性的值顯示為藍色。 在這里你可以看到內存的MBean的詳細屬性。

圖3-16設置可寫的屬性值

您可以通過點擊,然后編輯它們的屬性。 例如,啟用或禁用在JConsole詳細的垃圾收集器跟蹤,選擇在MBeans選項卡的MXBean 和詳細的屬性設置為真或假。 同樣,類加載的MXBean也有詳細的屬性,可以設置啟用或禁用類加載的詳細跟蹤。

MBean操作

選擇“操作”節點顯示一個MBean的所有操作。你可以通過按鈕去調用方法. 圖3-20 所有線程的方法。

Figure 3-17 Viewing All MBean Operations

選擇一個MBean樹中選擇一個方法,可以看到該方法的描述信息,如圖 3-18 .

Figure 3-18Viewing Individual MBean Operations

MBean通知

在左邊的樹中選擇訂閱,並點擊訂閱按鈕。右側將顯示收到的通知。如圖3-19。

Figure 3-19 Viewing MBean Notifications

選擇單個MBean通知,MBeanNotificationInfo會顯示在右窗格中,如圖3-20所示。

Figure 3-20 Viewing Individual MBean Notifications

HotSpot的診斷的MXBean

JConsole的MBeans選項卡還允許你告訴HotSpot虛擬機執行堆轉儲,並通過HotSpotDiagnostic MXBean的VM選項,以獲取或設置。

Figure 3-21 Viewing the HotSpot Diagnostic MBean

 

Figure 3-22 Viewing the HotSpot Diagnostic MBean

您可以手動執行堆轉儲調用com.sun.management.HotSpotDiagnostic MXBean的dumpheap命令操作。此外,您可以指定HeapDumpOnOutOfMemoryError Java VM選項,使用setVMOption操作,因此,VM執行堆轉儲時自動收到一個OutOfMemoryError。

 

創建自定義選項卡

除了現有的標准選項卡,你可以添加自己的自定義選項卡JConsole的,執行自己的監視活動。 JConsole的插件API提供了一種機制,例如,通過它可以添加標簽來訪問自己的應用程序的MBean。 JConsole這樣的插件API定義com.sun.tools.jconsole.JConsolePlugin抽象類,你可以擴展到建立您的自定義插件。

如上所述,您的插件必須繼承JConsolePlugin,並實現JConsolePlugin getTabs和newSwingWorker方法。 getTabs方法返回的選項卡的列表被添加到JConsole的,或者一個空列表。 newSwingWorker方法返回SwingWorker的負責插件的GUI更新。

您的插件必須提供一個Java歸檔(JAR)的文件,該文件包含一個名為META-INF/services/com.sun.tools.jconsole.JConsolePlugin文件。這個JConsolePlugin文件本身包含的所有插件完全合格的類名要添加新JConsole的標簽列表。 JConsole中使用的服務提供商的裝卸設施,來查找並加載插件。你可以有多個插件。
要加載到JConsole的新的自定義插件,啟動JConsole的用下面的命令:

%  jconsole -pluginpath plugin-path

在上面的命令,插件路徑指定要查找的JConsole插件的路徑。這些路徑可以是目錄名或JAR文件,並可以指定多個路徑,用你的平台的標准分隔符字符。

一個例子JConsole的插件提供了Java SE 6平台。 JTop應用程序是JDK的演示,展示了在應用程序中運行的所有線程的CPU使用率。這個演示是有用的識別,具有較高的CPU消耗的線程,它已被更新作為一個JConsole的插件以及一個獨立的GUI使用。 JTop是捆綁在一起的Java SE 6平台,作為一個演示應用程序。您可以運行的JTop插件JConsole中運行以下命令:

%JDK_HOME/bin/jconsole -pluginpath JDK_HOME/demo/management/JTop/JTop.jar

如果您連接到這種JConsole的實例,你會看到,JTop標簽已被添加,顯示運行各個線程的CPU使用率。

Figure 3-25 Viewing a Custom Plug-in Tab

 

 

參考:

1、http://www.ibm.com/developerworks/cn/java/j-5things7.html?ca=drs-

2、http://zhumeng8337797.blog.163.com/blog/static/1007689142012424114643418/

3、jconsole使用參考:http://hornetblog.sinaapp.com/?p=5

http://www.open-open.com/lib/view/open1345646982251.html 

Jconsole與Jmx 分析JVM狀況


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM