第5講-虛擬機性能監(jiān)控與故障處理工具之JDK命令行工具_第1頁
第5講-虛擬機性能監(jiān)控與故障處理工具之JDK命令行工具_第2頁
第5講-虛擬機性能監(jiān)控與故障處理工具之JDK命令行工具_第3頁
第5講-虛擬機性能監(jiān)控與故障處理工具之JDK命令行工具_第4頁
第5講-虛擬機性能監(jiān)控與故障處理工具之JDK命令行工具_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第5講-虛擬機性能監(jiān)控與故障處理工具之JDK命令行工具軟件工程系 潘正軍主要內(nèi)容大綱一JDK命令行工具概述二jps:虛擬機進程狀況工具三jstat:虛擬機統(tǒng)計信息監(jiān)控工具四jinfo:Java配置信息工具五jmap:Java內(nèi)存映像工具六jhat:虛擬機堆轉(zhuǎn)儲快照分析工具七jstack: Java堆棧跟蹤工具本節(jié)內(nèi)容引入Java開發(fā)人員肯定都知道JDK的bin目錄下有“java.exe“和”javac.exe“這兩個命令行工具,但并非所有程序員都了解過JDK的bin下其他命令行程序的作用。每逢JDK更新版本之時,bin目錄下命令行工具的數(shù)量和功能總會不知不覺地增加和增強。作者介紹了這些工具中的

2、一部分,主要用于監(jiān)視虛擬機和故障處理的工具。在軟件的使用說明中這些故障處理工具被聲明為”沒有技術(shù)支持并且是實驗性質(zhì)的“(unsupported and experimental)的產(chǎn)品,但事實上這些工具都非常穩(wěn)定并且功能強大,能在處理應用程序性能問題、定位故障時發(fā)揮很大的作用。這些工具體積都異常的小,大多都在30KB左右。并非JDK開發(fā)團隊刻意將他們制作得如此精煉來炫技,而是這些命令行工具大多數(shù)是jdklibtools.jar類庫的一層薄封裝而已。它們主要的功能代碼是在tools類庫中實現(xiàn)的。一、JDK命令行工具概述程序運行中經(jīng)常會遇到各種問題,定位問題時通常需要綜合各種信息,如系統(tǒng)日志、堆d

3、ump文件、線程dump文件、GC日志等。通過虛擬機監(jiān)控和診斷工具可以幫忙我們快速獲取、分析需要的數(shù)據(jù),進而提高問題解決速度。 本文將介紹虛擬機常用監(jiān)控和問題診斷命令工具的使用方法,主要包含以下工具: 表 Sun JDK監(jiān)控和故障處理工具名稱 主要功能 jps JVM Process Status Tool 顯示指定系統(tǒng)內(nèi)所有HotSpot虛擬機進程 jstat JVM Statistics Minitoring Tool 用于收集HotSpot虛擬機各方面的運行數(shù)據(jù) jinfo Configuration Info for Java 顯示虛擬機配置信息 jmap Memory Map for

4、 Java 生成虛擬機的內(nèi)存轉(zhuǎn)儲快照(heapdump)文件 jhat JVM Heap Dump Browser 用于分析heapdump文件,它會建立一個HTTP/HTML服務器,讓用戶可以在瀏覽器上查看分析結(jié)果 jstack Stack Trace for Java 顯示虛擬機的線程快照 命令行工具實戰(zhàn)案例代碼-JVMTools類命令行工具實戰(zhàn)案例代碼命令行工具實戰(zhàn)案例代碼-_1MObject類二、jps:虛擬機進程狀況工具JDK的很多小工具的名稱都參考了Unix命令的命名方式,jps(JVM Process Status Tool)是其中的典型。除了名字像Unix的ps命令外,功能也和

5、ps類似:可以列出正在運行的虛擬機進程,并顯示虛擬機執(zhí)行主類(Main Class,main()函數(shù)所在的類)的名稱,以及這些進程的本地虛擬機的唯一ID(LVMID,Local Virtual Machine Identifier)。雖然功能比較單一,但它是使用頻率最高的JDK命令行工具,因為其他JDK工具大多需要輸入它查詢到的LVMID來確定要監(jiān)控的是哪一個虛擬機進程。對于本地虛擬機進程來說,LVMID與操作系統(tǒng)的進程ID(PID,Process Identifier)是一致的,使用Windows的任務管理器或Unix的ps命令也可以查詢到虛擬機進程的LVMID,但如果使用了多個虛擬機進程,

6、無法根據(jù)進程名稱定位時,那就只能依賴jps命令顯示主類的功能才能區(qū)分了。jps命令格式和參數(shù)說明 jps命令格式:jps option hostid jps可以通過RMI協(xié)議查詢開啟了RMI服務的遠程虛擬機進程狀態(tài),hostid為RMI注冊表中注冊的主機名。jps的其他常用選項見下表jps執(zhí)行實例 結(jié)果分析與說明:9600 是jps本身的LVMID 6720 是JVMTools運行類的LVMID 5340 是Eclipse運行的LVMID三、jstat:虛擬機統(tǒng)計信息監(jiān)控工具jstat(JVM Statistics Monitoring Tool)是用于監(jiān)控虛擬機各種運行狀態(tài)信息的命令行工具。

7、它可以顯示本地或遠程虛擬機進程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運行數(shù)據(jù),在沒有GUI圖像界面,只提高了純文本控制臺環(huán)境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。jstat命令格式:jstat option vmid intervals|ms count 對于命令格式中的VMID與LVMID需要特別說明下:如果是本地虛擬機進程,VMID和LVMID是一致的,如果是遠程虛擬機進程,那VMID的格式應當是:protocol:/ lvmid hostname:port/servername三、jstat:虛擬機統(tǒng)計信息監(jiān)控工具 參數(shù)interval和count代表查詢間隔和次數(shù),如

8、果省略這兩個參數(shù),說明只查詢一次。假設需要每250毫秒查詢一次進程5828垃圾收集狀況,一共查詢5次,那命令行如下: jstat -gc 3980 250 4三、jstat:虛擬機統(tǒng)計信息監(jiān)控工具選項option代表這用戶希望查詢的虛擬機信息,主要分為3類:類裝載、垃圾收集和運行期編譯狀況,具體選項及租用參見下表:jstat執(zhí)行實例及結(jié)果分析這是我監(jiān)控到我的JVMTools的內(nèi)存狀況。查詢結(jié)果表明:新生代Eden區(qū)(E,表示Eden)使用了25.03%的空間,兩個Survivor區(qū)(S0、S1,表示Survivor0、Survivor1)里面都是空的,老年代(O,表示Old)和永久代(P,表示

9、Permanent)則分別使用了1.23%和1.42%的空間。程序運行以來共發(fā)生Minor GC(YGC,Young GC)148次,總耗時(YGCT,Young GC Time)0.038秒,發(fā)生Full GC(FGC)0次,總耗時(FGCT)0秒,所有GC總耗時(GCT)0.038秒。使用jstat工具在純文本狀態(tài)下監(jiān)視虛擬機狀態(tài)的變化,確實不如后面將會提到的VisualVM等可視化的監(jiān)視工具直接以圖表展現(xiàn)的那樣直觀。但很多服務器管理員都習慣了在文本控制臺共組哦,直接在控制臺中使用jstat命令已然是一種常用 的監(jiān)控方式。四、jinfo:Java配置信息工具jinfo(Configurat

10、ion Info for Java)的作用是實時地查看和調(diào)整虛擬機的各項參數(shù)。使用jps的命令的-v參數(shù)可以查看虛擬機啟動時顯示指定的參數(shù)列表,但如果想知道未被顯示指定的參數(shù)的系統(tǒng)默認值,除了去找資料外就只能使用jinfo的-flag選項進行查詢了(如果只限于JDK1.6或以上版本的話,使用java -XX:+PrintFlagsFinal查看參數(shù)默認值也是一個很好的選擇),jinfo還可以使用-sysprops選項把虛擬機進程的System.getProperties()的內(nèi)容打印出來。這個命令在JDK1.5時期已經(jīng)隨著Linux版的JDK發(fā)布,當時只提供了信息查詢的功能,JDK1.6之后,

11、jinfo在Windows和Linux平臺都有提供,并且加入了運行期修改參數(shù)的能力,可以使用-flag+|-name或-flag name=valule修改一部分運行期可寫的虛擬機參數(shù)值。JDK1.6中,jinfo對于Windows平臺的功能仍然有較大的限制,只提供了最基本的-flag選項。jinfo命令格式及執(zhí)行實例五、jmap:Java內(nèi)存映像工具jmap(Memory Map for Java)命令用于生產(chǎn)堆轉(zhuǎn)儲快照(一般稱為heapdump或dump文件)。如果不使用jmap命令,要向獲取Java堆轉(zhuǎn)儲快照還有一些比較”暴力“的手段:譬如-XX:+HeapDumpOnOutOfMemo

12、ryError參數(shù),可以讓虛擬機在OOM異常出現(xiàn)之后自動生生成dump文件,通過-XX:+HeapDumpOnCtrlBreak參數(shù)則可以使用Ctrl+Break鍵讓虛擬機生成dump文件,又或者在Linux系統(tǒng)下通過Kill -3命令發(fā)送進程退出信號”恐嚇“一下虛擬機,也能拿到dump文件。jmap的作用并不僅僅是為了獲取dump文件,它還可以查詢finalize執(zhí)行隊列,Java堆和永久代的詳細信息,如空間使用率、當前用的是那種收集器等。五、jmap:Java內(nèi)存映像工具jmap執(zhí)行實例及結(jié)果 這是使用jmap生成一個正在運行的JVMTools的dump快照文件的例子,3980為jps查詢

13、到的LVMID。 在D盤根目錄下會生成一個快照文件heapdump六、jhat:虛擬機堆轉(zhuǎn)儲快照分析工具Sun JDK提供了jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap生成的堆轉(zhuǎn)儲快照。jhat內(nèi)置了一個微型的HTTP/HTML服務器,生成dump文件的分析結(jié)果后,可以在瀏覽器中查看,不過實事求是地說,在實際工作中,除非真的沒有別的工具可用,否則一般不會去直接使用jhat命令來分析demp文件,主要原因有二:意識一般不會在部署應用程序的服務器上直接分析dump文件,即使可以這樣做,也會盡量將dump文件拷貝到其他機器上進行分析,因為分析工作時一

14、個耗時且消耗硬件資源的過程,既然都要在其他機器上進行,就沒必要收到命令行工具的限制了。另外一個原因是jhat的分析功能相對來說很簡陋VisualVM以及專門分析dump文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能實現(xiàn)比jhat更強大更專業(yè)的分析功能。jhat執(zhí)行實例及結(jié)果Server is ready.出現(xiàn)后就可以在瀏覽器中鍵入http:/localhost:7000 查看分析結(jié)果了。分析結(jié)果默認以包為單位進行分組顯示,分析內(nèi)存泄露問題主要會使用到其中的”Heap Histogram“(與jmap-hosto功能一樣)與OQL頁簽的功能。前

15、者可以找到內(nèi)存總?cè)萘孔畲蟮膶ο?,后者是標準的對象查詢語句,使用類似SQL的語法對內(nèi)存中的對象進行查詢統(tǒng)計。瀏覽器中鍵入http:/localhost:7000 查看分析結(jié)果七、jstack: Java堆棧跟蹤工具jstack(Stack Trace for Java)命令用于生成虛擬機當前時刻的線程快照(一般稱為threaddump或javacore文件)。線程快照就是當前虛擬機內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調(diào)用堆棧,就可以知道沒有響應的線程到底在后臺做些什么事情,或者等待著什么資源。七、jstack: Java堆棧跟蹤工具jstack執(zhí)行實例及結(jié)果jstack瀏覽

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論