本文轉貼至http://tw.myblog.yahoo.com/eoda227/article?mid=544&prev=551&next=499
使用 jconsole 來監視 Java 程式使用資源 最近的專案都需要使用Java來開發程式,在Java程式開發中需要一些java程式debug與性能調整方面的工作,jconsole是jdk內建的工具比較好用。
Jconsole簡介: Jconsole是一個JMX相容的監視工具。它使用Java虛擬機器的JMX機制來提供運行在Java平臺的應用程式的性能與資源耗費資訊。
開始 jconsole(我是使用 jdk6)
Jconsole應用程式位於JDK_HOME/bin目錄下。
可以使用 jconsole 監視本地應用程式和遠端應用程式。
注意:在開發階段或者原型階段,使用jconsole監視本地應用程式是很有用的,但是不建議在正式環境中使用,因為jconsole本身也將顯著的消耗系統資源。推薦使用遠端監視來將jconsole和被監視平臺孤立開。
監視本地應用程式 (我用 Eclipse來當被監測對象)
1. 開啟 eclipse
2. 開啟 jconsole,選”Local Process” 中剛才開啟的 eclipse,按 “Connect” 來監看
Jconsole介面: Jconsole介面由以下六個選頁籤組成:
- Overview頁籤:顯示JVM和被監視值的匯總資訊。
- Memory頁籤:顯示記憶體使用資訊。
- Threads頁籤:顯示執行緒使用資訊。
- Classes頁籤:顯示類(class)載入資訊。
- VMSummary頁籤:顯示JVM資訊。
- MBeans頁籤:顯示MBeans資訊。
以下是詳細介紹:
(1) Overview頁籤
- 有Heap記憶區使用情況
- Threads個數
- Class載入個數
- CPU使用百分比
(2) Memory 頁籤
以上圖表顯示了JVM的記憶體使用和時間的對應關係,主要包括: (a) heap和(b) non-heap
PS.
Heap and Non-heap記憶體 :JVM管理兩種記憶體:heap 和 non-heap 記憶體,兩種記憶體都是在JVM啟動時建立。
Heap memory 是運行時資料區域,用於JVM為所有物件實例和佇列分配的記憶體。Heap可能為固定值或者可變值。垃圾收集器是一個用於回收物件佔用的heap記憶體的自動化記憶體管理系統。
Non-heap memory
包含一個在所有執行序共用的方法區域(method
area)和內部進程或JVM優化所需的記憶體。它存儲了每一個類的結構,比如運行常量池,欄位和方法資料,構造函數和方法的代碼。方法區域邏輯上是
heap的一部分,但是依賴於實現,JVM可能不進行垃圾收集或壓縮。像heap一樣,方法區域可能為固定或可變大小。方法區域所需要的記憶體沒有必要是
連續的。
Heap Memory Pool:
A. Eden Space(heap):大多數物件初始化時從Eden Space池分配記憶體,即是存在于此池中
B. Survivor Space(heap):此池包含的物件是那些原先在eden space中,但是已經經歷過垃圾回收而仍然存在的物件。
C. Tenured Generation(heap):在surviver space中已經存在了一段時間之後的物件會移動到這個池中。
Non-Heap Memory Pool:
D. Code Cache (non-heap):儲存編譯的程式碼和local variables。
E. Permanent Generation(non-heap):包含虛擬機器自身的所有反射資料。比如class和mothod物件。對於使用class data sharing的JVM,分為唯讀(shared-ro)和讀寫(shared-rw)兩個區域。
Details區域顯示了幾種當前記憶體度量:
Time:目前的時間。
Used:目前使用的記憶體總量。
Committed:JVM
可使用的記憶體量。Committed記憶體數量可能隨時間變化而變化。JAVA虛擬機器可能將某些記憶體釋放,還給作業系統,committed記憶體
可能比啟動時初始分配的記憶體量要少。Committed記憶體總是大於等於used記憶體。
Max:記憶體管理可用的最大記憶體數量。此值可能改變或者為未定義。如果JVM試圖增加使用記憶體(used memory)超出了committed記憶體,那麼即時使用記憶體小於或者等於最大記憶體(比如系統虛擬記憶體較低),記憶體分配仍可能失敗。
GC Time:Garbage collection的時間。
Permanent Generation的排列如下圖:
(3) Threads頁籤
(4) Classes頁籤
(5) VMSummary頁籤
(6) MBeans頁籤
3. 開啟Eclipse中的Tomcat (1) 在index.jsp 上點選右鍵
(2) 選 Run on Server 執行
(3) 執行後結果
4. 切換到jconsole視窗,觀看結果
(1) Overview圖有明顯變化
(2) Heap memory Usage
(2) Non-Heap memory Usage
監視遠端應用程式 (以Tomcat為測試對象)
1. 配置tomcat使用jconsole
修改catalina腳本
Windows平臺:修改catalina.bat,在 ”dostart:” 後增加一行(注意是一行):
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"
Unix/Linux平臺:修改catalina.sh,在 ”dostart:” 後增加一行(注意是一行):
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"
2. 啟動Tomcate (startup.bat或啟動 service)
3. 到遠端的電腦,啟動jconsole
4. 可同樣觀察遠端Tomcat執行情況
註:如果想設定遠端的管理帳號密碼,可以參考
http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html 的設定
通常在 發生 “
Memory Error” 如 Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
或
Exception unloading sessions to persistent storage java.lang.OutOfMemoryError: PermGen space
請調整JVM的參數設定,-XX:PermSize=256M -XX:MaxPermSize=256M 等參數(依個人電腦上的資源與可能用到的記憶過大小再去設定,觀察Memory頁籤,大概多留20%就夠了)
屬性詳細請參考:http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp
參考來源:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
留言列表