JConsole是一個基於JMX的GUI工具,用於鏈接正在運行的JVM,它是Java自帶的簡單性能監控工具。下面以對tomcat的監控爲例,帶領你們熟悉Jconsole這個工具。html
Step 1,在dos/bash命令下輸入:jconsole;java
Step 2,在彈出的對話框中選中apache,並點擊connect(假設你的tomcat已經啓動);linux
接下來,你就能使用jconsole來作一些簡單的性能監控了。算法
1. 概要界面,主要顯示堆內存使用狀況、活動線程數、加載類數、CPU使用率四個參數的概要,能夠經過下拉框來定製顯示的時間範圍;apache
2. 假如堆內存的圖像一直在上升而沒有降低的動做發生,則要懷疑是否內存泄露;健壯的項目因爲GC的存在,因此它的上升和降低的幅度應該大抵相同;編程
3. CPU的圖像規律跟堆內存的大體相同。windows
1. 圖示爲被監控程序的詳細內存圖;設計模式
2. 關注點1:點擊右上的GC按鈕能夠通知JVM進行垃圾回收,實質是把垃圾回收隊列的優先級提升;緩存
3. 關注點2:GC time顯示了每次回收的時間、算法以及回收數,7.619 seconds是用時,Copy表示垃圾回收機制的複製算法,MarkSweepCompact表示垃圾回收機制的標記-清除-壓縮算法,1426 collections表示回收的數量;tomcat
4. 右下角的圖案,Heap內存區包括:年輕代Eden Space、存活代Survivor Space和老年代Tenured Gen;Non-Heap內存區包括:代碼緩存區Code Cache和持久代Perm Gen;可經過改變下拉框或者直接點擊圖形實現切換。
1. Peak表示最大的線程數,這個數值能夠經過更改<tomcat_home>/conf/server.xml下的maxThreads來更改;
2. 點擊具體的Thread以後,咱們能夠看到它的方法棧的詳細調用狀況;
3. 點擊Detect Deadlock能夠檢測是否有死鎖。
關注點:類的數量變化。
關注點1:上面幾欄是關於系統和項目的概要信息;
關注點2:最下面一欄的第一項是tomcat設定的JVM參數,若是你想知道你設置的參數有沒有成功啓用,看這裏就對了。
關注點1:Attributes顯示該bean的詳細細節;
關注點2:Operations顯示該bean的全部方法,能夠點擊該按鈕觸發方法,但我的不推薦這麼作,應該經過程序的統一入口來觸發。
JVisualVM是Netbeans的profile子項目,已在JDK6.0 update 7 中自帶(bin/jvisualvm.exe),可以監控線程,內存狀況,查看方法的CPU時間和內存中的對象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的)。
Step 1,假如你手頭上的Tomcat項目已經啓動,在bash/dos下輸入:jvisualvm,敲擊回車;
Step 2,選中Tomcat,雙擊便可啓動監控,在初始頁面咱們便可看到一些概要信息和JVM參數。
關注點1:按鈕「Perform GC」可通知JVM將垃圾回收動做的優先級提升;
關注點2:「Daemon」線程是指JVM的守護線程,通俗的理解爲JVM的系統進程;
關注點3:按鈕「Heap Dump」可生成堆內存快照,下面詳細講解Heap Dump的使用。
關注點1:紅框標註的箭頭處,能夠憑你的點擊順序切換先後窗口;
關注點2:「Inspect」檢查處能夠查詢最大的對象,個數可自行定製;
關注點3:點擊「Show Threads」能夠顯示線程細節,以下所示:
關注點1:timed_waiting和runnable表示線程運行狀態;
關注點2:daemon表示這個線程是守護線程,如沒有標記daemon則表示它是一個用戶線程,如main線程;
關注點3:prio表示該線程的優先級,在java線程中數字越大優先級越高,取值在1至10之間,默認爲5;
關注點4:點擊被標註成藍色的相關類,能夠在Instances界面查看細節;
關注點1:右上角的三個按鈕能夠對界面進行定製;
關注點2:點擊「Compute Retained Sizes」可計算每一個field的保留尺寸,簡言之就是它所佔的byte值;
關注點3:右下角紅框處標記出了,不一樣的圖形表明不一樣的角色;
關注點1:左下角能夠經過filter來過濾顯示視圖;
關注點2:右擊某個類可讓其在Instances界面顯示,查看其細節;
關注點3:點擊右上角紅框處能夠與另外一個內存快照進行比較,在比較視圖中能夠看出每一個類的增長和減小的狀況;
關注點1:點擊Saved Queries,選中具體的Query實例,在點擊Execute就能夠進行查詢了,Save按鈕能夠保存你的query語句;
關注點2:比較使用的是PermGen分析語句;
關注點1:線程的顏色從綠、紫、黃、紅,分別表明運行、休眠、等待和死鎖;
關注點2:Timeline以時間軸顯示線程狀況,Table以表格顯示,Details以細節的圖形+表格方式顯示線程狀況。固然你也能夠選中單個線程來顯示,經過點擊下拉框便可實現;
關注點3:點擊Thread Dump便可生成線程快照,其功能跟2.2.1.1 Heap Dump 1)Summary中的Show Threads相似,這裏很少加解釋。
1. 經過settings能夠對CPU的採樣來源以及內存的刷新時間進行設置;
2. 點擊CPU或者Memory便可開始監控,點擊Stop則中止採樣;
關注點1:點擊Thread Dump可生成線程快照;
關注點2:點擊Snapshot可生成線程的快照,快照裏面包含了全部線程的調用樹以及其熱點編譯狀況,以下圖所示:
關注點:點擊Deltas按鈕後,可記錄線程的變化,功能有點相似JProfiler的「Mark Current Values」。
關注點1:Deltas、Peform GC、Heap Dump的功能與上文相似;
關注點2:點擊Snapshot將生成以下的內存快照,主要顯示堆內存中類的內存信息:
圖爲持久代的內存狀況。
圖爲每一個線程的內存分佈狀況。
Profiler跟Sampler不一樣在於它是對程序的實時監控,而Sampler只能說是一段時間內的統計採樣。
在CPU功能模塊咱們能夠看到每一個熱點編譯方法的使用時間。
對當前存活對象的實時監控。
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'