原由:在測試服務器RedHat中啓動datacenter時,會機率性地出現卡殼現象,而以前的一個月每日更新測試環境並無碰到此問題,因爲沒有任何異常信息顯示且該問題又是該機率性的發生這下子可把我難住了。想到了應該是最近重構了工程所致,因而叫一位負責重構的師兄過來協助解決,只見同事觀察了一下後鍵入了一些命令那個連上了Jconsole,在Jonsole的監控界面檢測到了死鎖現象,所以問題也就所以定位... ...
完事以後師兄打開了%JAVA_HOME%/bin目錄,對裏面的一些經常使用的jdk工具進行了簡單的介紹並建議我去學學jdk工具的基本原理與使用。
一、JDK簡介
JDK 是整個Java的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具和Java基礎的類庫(rt.jar)。
經常使用的JDK有Sun的JDK,IBM的JDK,原BEA的BEA公司的 Jrocket
二、JDK經常使用工具介紹
看了一下,bin目錄下的jdk工具備四五十個的樣子,所有掌握一方面是由於成本過高二則是由於沒有太大必要(2/8原則仍然使用),現對經常使用的一些工具進行學習,其餘工具待往後有須要時再去學習。以下是本人根據解釋列舉的一些自認爲比較重要的工具... ... html
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)內存 |
三、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.無認證鏈接 (下面的設置表示:鏈接的端口爲123四、無需認證就能夠被鏈接) java
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
四、 Jstat使用
jstat工具特別強大,有衆多的可選項,詳細查看堆內各個部分的使用量,以及加載類的數量。使用時,需加上查看進程的進程id,和所選參數。如下詳細介紹各個參數的意義。
jstat -class pid:顯示加載class的數量,及所佔空間等信息。
jstat -compiler pid:顯示VM實時編譯的數量等信息。
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每三行顯示一下標題。
五、 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文件裏。
六、 jps的使用
jps [-q] [-mlvV] [<hostid>]
參數解釋: 程序員
-p | 只顯示pid,不顯示class名稱,jar文件名和傳遞給main 方法的參數 |
-m | 輸出傳遞給main 方法的參數,在嵌入式jvm上多是null |
-l | 輸出應用程序main class的完整package名或者應用程序的jar文件完整路徑名 |
-v | 輸出傳遞給JVM的參數 |
七、 關於對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... ... shell