1. 程式人生 > >Java自帶的GUI效能監控工具Jconsole以及JisualVM簡介

Java自帶的GUI效能監控工具Jconsole以及JisualVM簡介

1 Jconsole

1.1 簡介以及連線

  JConsole是一個基於JMX的GUI工具,用於連線正在執行的JVM,它是Java自帶的簡單效能監控工具。下面以對tomcat的監控為例,帶領大家熟悉Jconsole這個工具。

  Step 1,在dos/bash命令下輸入:jconsole;

  Step 2,在彈出的對話方塊中選中apache,並點選connect(假設你的tomcat已經啟動);

  

  接下來,你就能使用jconsole來做一些簡單的效能監控了。

1.2 模組介紹

1.2.1 Overview

  

  1. 概要介面,主要顯示堆記憶體使用情況、活動執行緒數、載入類數、CPU使用率四個引數的概要,可以通過下拉框來定製顯示的時間範圍;

  2. 假如堆記憶體的影象一直在上升而沒有下降的動作發生,則要懷疑是否記憶體洩露;健壯的專案由於GC的存在,所以它的上升和下降的幅度應該大抵相同;

  3. CPU的影象規律跟堆記憶體的大致相同。

1.2.2 Memory

  

  1. 圖示為被監控程式的詳細記憶體圖;

  2. 關注點1:點選右上的GC按鈕可以通知JVM進行垃圾回收,實質是把垃圾回收佇列的優先順序提高;

  3. 關注點2:GC time顯示了每次回收的時間、演算法以及回收數,7.619 seconds是用時,Copy表示垃圾回收機制的複製演算法,MarkSweepCompact表示垃圾回收機制的標記-清除-壓縮演算法,1426 collections表示回收的數量;

  4. 右下角的圖案,Heap記憶體區包括:年輕代Eden Space、存活代Survivor Space和老年代Tenured Gen;Non-Heap記憶體區包括:程式碼快取區Code Cache和持久代Perm Gen;可通過改變下拉框或者直接點選圖形實現切換。

1.2.3 Threads

  

  1. Peak表示最大的執行緒數,這個數值可以通過更改<tomcat_home>/conf/server.xml下的maxThreads來更改;

  2. 點選具體的Thread之後,我們可以看到它的方法棧的詳細呼叫情況;

  3. 點選Detect Deadlock可以檢測是否有死鎖。

1.2.4 Classes

  

  關注點:類的數量變化。

1.2.5 VM Summary

  

  關注點1:上面幾欄是關於系統和專案的概要資訊;

  關注點2:最下面一欄的第一項是tomcat設定的JVM引數,如果你想知道你設定的引數有沒有成功啟用,看這裡就對了。

1.2.6 MBeans

  

  關注點1:Attributes顯示該bean的詳細細節;

  

   關注點2:Operations顯示該bean的所有方法,可以點選該按鈕觸發方法,但個人不推薦這麼做,應該通過程式的統一入口來觸發。 

2 JVisualVM

2.1 簡介以及連線

  JVisualVM是Netbeans的profile子專案,已在JDK6.0 update 7 中自帶(bin/jvisualvm.exe),能夠監控執行緒,記憶體情況,檢視方法的CPU時間和記憶體中的物件,已被GC的物件,反向檢視分配的堆疊(如100個String物件分別由哪幾個物件分配出來的)。

  Step 1,假如你手頭上的Tomcat專案已經啟動,在bash/dos下輸入:jvisualvm,敲擊回車;

  Step 2,選中Tomcat,雙擊即可啟動監控,在初始頁面我們即可看到一些概要資訊和JVM引數。

  

2.2 模組介紹

2.2.1 Monitor

  

  關注點1:按鈕“Perform GC”可通知JVM將垃圾回收動作的優先順序提高;

  關注點2:“Daemon”執行緒是指JVM的守護執行緒,通俗的理解為JVM的系統程序;

  關注點3:按鈕“Heap Dump”可生成堆記憶體快照,下面詳細講解Heap Dump的使用。

2.2.1.1 Heap Dump

  1)Summary

  

  關注點1:紅框標註的箭頭處,可以憑你的點選順序切換前後視窗;

  關注點2:“Inspect”檢查處可以查詢最大的物件,個數可自行定製;

  關注點3:點選“Show Threads”可以顯示執行緒細節,如下所示:

  

  關注點1:timed_waiting和runnable表示執行緒執行狀態;

  關注點2:daemon表示這個執行緒是守護執行緒,如沒有標記daemon則表示它是一個使用者執行緒,如main執行緒;

  關注點3:prio表示該執行緒的優先順序,在java執行緒中數字越大優先順序越高,取值在1至10之間,預設為5;

  關注點4:點選被標註成藍色的相關類,可以在Instances介面檢視細節;

  2)Instances

  

  關注點1:右上角的三個按鈕可以對介面進行定製;

  關注點2:點選“Compute Retained Sizes”可計算每個field的保留尺寸,簡言之就是它所佔的byte值;

  關注點3:右下角紅框處標記出了,不同的圖形代表不同的角色;

  3)Classes

  

  關注點1:左下角可以通過filter來過濾顯示檢視;

  關注點2:右擊某個類可以讓其在Instances介面顯示,檢視其細節;

  關注點3:點選右上角紅框處可以與另一個記憶體快照進行比較,在比較檢視中可以看出每個類的增加和減少的情況;

  4)OQL Console

  

  關注點1:點選Saved Queries,選中具體的Query例項,在點選Execute就可以進行查詢了,Save按鈕可以儲存你的query語句;

  關注點2:比較使用的是PermGen分析語句;

2.2.2 Threads

  

  關注點1:執行緒的顏色從綠、紫、黃、紅,分別代表執行、休眠、等待和死鎖;

  關注點2:Timeline以時間軸顯示執行緒情況,Table以表格顯示,Details以細節的圖形+表格方式顯示執行緒情況。當然你也可以選中單個執行緒來顯示,通過點選下拉框即可實現;

  關注點3:點選Thread Dump即可生成執行緒快照,其功能跟2.2.1.1 Heap Dump 1)Summary中的Show Threads類似,這裡不多加解釋。

2.2.3 Sampler

2.2.3.1 取樣器簡介

  1. 通過settings可以對CPU的取樣來源以及記憶體的重新整理時間進行設定;

  2. 點選CPU或者Memory即可開始監控,點選Stop則停止取樣;

2.2.3.2 CPU

  1)CPU samples

  

  關注點1:點選Thread Dump可生成執行緒快照;

  關注點2:點選Snapshot可生成執行緒的快照,快照裡面包含了所有執行緒的呼叫樹以及其熱點編譯情況,如下圖所示:

  

  2)Thread CPU Time

   

  關注點:點選Deltas按鈕後,可記錄執行緒的變化,功能有點類似JProfiler的“Mark Current Values”。

2.2.3.3 Memory

  1)Heap histogram

  

  關注點1:Deltas、Peform GC、Heap Dump的功能與上文類似;

  關注點2:點選Snapshot將生成如下的記憶體快照,主要顯示堆記憶體中類的記憶體資訊:

  

  2)PermGen histogram

  

  圖為持久代的記憶體情況。

  3)Perthread allocations

  

  圖為每個執行緒的記憶體分佈情況。

2.2.4 Profiler

2.2.4.1 CPU

  

  Profiler跟Sampler不同在於它是對程式的實時監控,而Sampler只能說是一段時間內的統計取樣。

  在CPU功能模組我們可以看到每個熱點編譯方法的使用時間。

2.2.4.2 Thread

  

  對當前存活物件的實時監控。

3 如何開啟遠端監控

3.1 Tomcat中的引數設定

  windows系統在catalina_home/bin/setenv.bat中加入如下配置:  

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port="9005" -Dcom.sun.management.jmxremote.authenticate="false" -Dcom.sun.management.jmxremote.ssl="false"

  linux系統在catalina_home/bin/setenv.sh中加入如下配置:  

export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port='9005' -Dcom.sun.management.jmxremote.authenticate='false' -Dcom.sun.management.jmxremote.ssl='false'"

  1)‘-Dcom.sun.management.jmxremote’表示啟用Java Management Extensions(Java管理擴充套件)技術,簡稱JMX。JMX在Java程式語言中定義了應用程式以及網路管理和監控的體系結構、設計模式、應用程式介面以及服務。通常使用JMX來監控系統的執行狀態或管理系統的某些方面,比如清空快取、重新載入配置檔案等。

  2)‘9004’表示這個JMX服務的埠號;

  3)‘authenticate’表示false時無需帳號密碼驗證,如改為true(啟用帳號密碼驗證),需增加以下配置:

    >  在JRE_HOME/lib/management下將'jmxremote.password.template'檔案複製多一份,比如複製為'jmxremote.password',將這個複製出來的新檔案底部的monitorRole和controlRole前面的註釋去掉;

    >  monitorRole的值表示讀取的密碼,controlRole表示讀取和寫入的密碼,請將二者的值更改為你想要的密碼;

    >  修改setenv.sh配置(windows請修改.bat)如下:

    export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port='9005' -Dcom.sun.management.jmxremote.password.file=pwdFilePath -Dcom.sun.management.jmxremote.ssl='false'"

    >  ‘Set file permissions so that only you can read and write the password file’,這個複製出來的密碼檔案需設定成只有屬主具備讀寫許可權,否則tomcat將無法正常啟動;

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

3.2 Jconsole的配置

3.3 Jvisulvm的配置