[size=large] 起因:在測試伺服器RedHat中啟動datacenter時,會機率性地出現卡殼現象,而之前的一個月每日更新測試環境並沒有碰到此問題,由於沒有任何異常資訊顯示且該問題又是該機率性的發生這下子可把我難住了。想到了應該是最近重構了工程所致,於是叫一位負責重構的師兄過來協助解決,只見同事觀察了一下後鍵入了一些命令那個連上了Jconsole,在Jonsole的監控介面檢測到了死結現象,因此問題也就因此定位... ...
完事之後師兄開啟了%JAVA_HOME%/bin目錄,對裡面的一些常用的jdk工具進行了簡單的介紹並建議我去學學jdk工具的基本原理與使用。
1、JDK簡介
JDK 是整個Java的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具和Java基礎的類庫(rt.jar)。
常用的JDK有Sun的JDK,IBM的JDK,原BEA的BEA公司的 Jrocket
2、JDK常用工具介紹
看了一下,bin目錄下的jdk工具有四五十個的樣子,全部掌握一方面是因為成本太高二則是因為沒有太大必要(2/8原則仍然使用),現對常用的一些工具進行學習,其他工具待日後有需要時再去學習。如下是本人根據解釋列舉的一些自認為比較重要的工具... ...
| javac.exe |
Java編譯器,將Java原始碼轉換成位元組碼 |
| Java.exe |
Java解譯器,直接從類檔案執行Java應用程式位元組代碼 |
| Javadoc.exe |
根據Java源碼及說明語句產生HTML文檔 |
| Jdb.exe |
Java調試器,可以逐行執行程式,設定斷點和檢查變數 |
| Javah.exe |
產生可以調用Java過程的C過程,或建立能被Java程式調用的C過程的標頭檔 |
| Javap.exe |
Java反組譯碼器,顯示編譯類檔案中的可訪問功能和資料,顯示位元組代碼含 |
| Jar.exe |
將Java類檔案和其他資源檔捆綁成一個一的jar檔案 |
| native2ascii |
用於轉換字元或者檔案的編碼格式 |
| servertools |
為程式員提供了一個命令列介面,用於註冊取消註冊,啟動,關閉一個服務 |
| JConsole |
是一個基於JMX的GUI工具,用於串連正在啟動並執行JVM,主要用於監控 |
| jps |
jps尋找目前使用者的Java進程,注意:不是當前系統中的所有進程 |
| jstack |
jstack列印所有的Java線程的堆疊追蹤資訊 |
| jstat |
顯示一個測量(instrumented)Java HotSpot虛擬機器的效能統計資訊 |
| jstatd |
是一個Java遠程方法調用 (RMI)伺服器應用程式-它監控測量Java HotSpot虛擬機器的建立和終止並且提供一個介面來允許遠程監控工具依附到運行於本地主機的JVM |
| jmap |
列印出某個java進程(使用pid)記憶體,列印出某個java進程(使用pid)記憶體 |
3、JConsole學習
從Java 5開始 引入了 JConsole。JConsole 是一個內建 Java 效能分析器,可以從命令列或在 GUI shell 中運行。您可以輕鬆地使用 JConsole(或者,它更高端的 “近親” VisualVM )來監控 Java 應用程式效能和跟蹤 Java 中的代碼。
A、 啟動JConsole
A.1:如果是從命令列啟動,使 JDK 在 PATH 上,運行 jconsole 即可。
A.2:如果從 GUI shell 啟動,找到 JDK 安裝路徑,開啟 bin 檔案夾,雙擊 jconsole
B、 如何設定JAVA程式運行時可以被JConsolse串連分析
B.1:本地程式(相對於開啟JConsole的電腦),無需設定任何參數就可以被本地開啟的JConsole串連(Java SE 6開始無需設定,之前還是需要設定運行時參數 -Dcom.sun.management.jmxremote )
B.2: 2.無認證串連 (下面的設定表示:串連的連接埠為1234、無需認證就可以被串連)
-Dcom.sun.management.jmxremote.port=1234-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
B.3:如果考慮到安全因素,需要認證,需要安全連線,也是可以搞定的。參考:
http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenv
C、 JConsole如何串連遠程機器的JAVA程式
C.1: 被遠端連線的主機可以採取如下做法
.命令列:
帶上B.2中的參數運行Java程式
.Eclipse中:
C.2: 訪問遠端連線時
.命令列:
jconsole.exe 192.168.0.181:1234
.使用JConsole圖形介面進行訪問
恭喜你,此時就進入了JConsole的分析介面!
關於頁面資訊都很直觀沒什麼好說的,值得一提的是對著圖點擊右鍵可以儲存資料到CSV檔案,以後可以使用其他工具來分析這些資料。
D、 JConsole使用執行個體
就有限的工作經驗來說的話,JConsole比較多的用來分析應用伺服器的效能,如Tomcat/Apusic/JBoss等。
監控伺服器的配置方法:
編輯run.bat(win下)或者run.sh(Linux下),找到如下內容
set JAVA_OPTS=%JAVA_OPTS%,在其後加上B.2中所列的參數即可。
推薦使用升級版 JConsole 即 jvisualvm
4、 Jstat使用
jstat工具特彆強大,有眾多的可選項,詳細查看堆內各個部分的使用量,以及載入類的數量。使用時,需加上查看進程的進程id,和所選參數。以下詳細介紹各個參數的意義。
jstat -class pid:顯示載入class的數量,及所佔空間等資訊。
jstat -compiler pid:顯示VMJust-In-Time 編譯的數量等資訊。
jstat -gc pid:可以顯示gc的資訊,查看gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity:可以顯示,VM記憶體中三代(young,old,perm)對象的使用和佔用大小,如:PGCMN顯示的是最小perm的記憶體使用量量,PGCMX顯示的是perm的記憶體最大使用量,PGC是當前新產生的perm記憶體佔用量,PC是但前perm記憶體佔用量。其他的可以根據這個類推, OC是old內純的佔用量。
jstat -gcnew pid:new對象的資訊。
jstat -gcnewcapacity pid:new對象的資訊及其佔用量。
jstat -gcold pid:old對象的資訊。
jstat -gcoldcapacity pid:old對象的資訊及其佔用量。
jstat -gcpermcapacity pid: perm對象的資訊及其佔用量。
jstat -util pid:統計gc資訊統計。
jstat -printcompilation pid:當前VM執行的資訊。
除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒列印一次,一共列印6次,還可以加上-h3每三行顯示一下標題。
5、 jmap使用
jmap 是一個可以輸出所有記憶體中對象的工具,甚至可以將VM 中的heap,以二進位輸出成文本。使用方法 jmap -histo pid。如果連用 SHELL jmap -histo pid>a.log可以將其儲存到文本中去(windows下也可以使用),在一段時間後,使用文本對比工具,可以對比出GC回收了哪些對象。jmap -dump:format=b,file=f1 3024可以將3024進程的記憶體heap輸出出來到f1檔案裡。
6、 jps的使用
jps [-q] [-mlvV] [<hostid>]
參數解釋:
hostid的定義為: ip:port
| -p |
只顯示pid,不顯示class名稱,jar檔案名稱和傳遞給main 方法的參數 |
| -m |
輸出傳遞給main 方法的參數,在嵌入式jvm上可能是null |
| -l |
輸出應用程式main class的完整package名或者應用程式的jar檔案完整路徑名 |
| -v |
輸出傳遞給JVM的參數 |
7、 關於對java效能的分析而言,JPofiler是個不錯的選擇。
它把CPU、執行緒和記憶體的剖析組合在一個強大的應用中。JProfiler可提供許多IDE整合和應用伺服器整合用途。
JProfiler直覺式的GUI讓你可以找到效能瓶頸、抓出記憶體漏失(memory leaks)、並解決執行緒的問題。它讓你得以對heap walker作資源回收器的root analysis,可以輕易找出記憶體漏失;heap快照(snapshot)模式讓未被參照(reference)的對象、稍微被參照的對象、或在終結(finalization)隊列的對象都會被移除;整合精靈以便剖析瀏覽器的Java外掛功能。
如下是一個關於JProfiler使用入門的比較好的參考資料:
http://wenku.baidu.com/view/35909d5f312b3169a451a442.html
待日後需要時再去學習,那樣學習效果會更好,標記Ing... ...
參考資料:
http://jiajun.javaeye.com/blog/810150
http://jiajun.javaeye.com/blog/443196