3.1 概述
給系統定位問題時,知識、經驗是關鍵基礎,資料是依據,工具是運用知識處理資料的字段。這裡的資料是包括:運作日志、異常堆棧、GC日志、線程快照(threaddump / javacore檔案)、堆轉儲快照(headdump / hprof檔案)等。
3.2 JDK的指令行工具
Sun JDK監控和故障處理工具如下:
3.2.1 jps:虛拟機程序狀況工具
jps(JVM Process Status Tool)可以列出正在運作的虛拟機程序,并顯示虛拟機主類(Main Class, main()函數所在的類)名稱,以及這些程序的本地虛拟機唯一ID。 jps指令格式:jps [options] [hostid] 示例:jps -vl
546 -Dosgi.requiredJavaVersion=1.8 -XX:+UseG1GC -XX:+UseStringDeduplication -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m -Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
755 sun.tools.jps.Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home -Xms8m
575 -Dosgi.requiredJavaVersion=1.6 -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -XX:MaxPermSize=256m -Xms40m -Xmx512m -Xdock:icon=../Resources/Eclipse.icns -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
jps工具主要選項如下:
3.2.2 jstat:虛拟機統計資訊監視工具
jstat(JVM Statistics Monitoring Tool)是用于監視虛拟機各種運作狀态資訊的指令行工具。它可以顯示本地或者遠端虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料,在沒有GUI圖形界面,隻提供了純文字控制台環境的伺服器上,它将是運作期定位虛拟機性能問題的首選工具。 jstat指令格式為:jstat [ option vmid [ interval [ s | ms ] [count] ] ] 對于指令行格式中的VMID與LVMID:如果是本地虛拟機程序,VMID與LVMID是一緻的,如果是遠端虛拟機程序,那VMID的格式應當是: [protocol:] [//] lvmid [@hostname [:port]/servername] 參數interval和count代表查詢間隔和次數,說明隻查詢一次。如假設需要每個250毫秒去查詢一次程序768垃圾收集狀況,一共查詢了20次,那指令應當是: jstat -gc 768 250 20
選項option代表着使用者希望查詢的虛拟機資訊,主要分為3類:類裝載、垃圾收集、運作期編譯狀況,具體選項如下:
3.2.3 jinfo:Java配置資訊工具
jinfo(Configuration Info for Java) 的作用是實時地檢視和調整虛拟機各項參數。
3.2.4 jmap:Java記憶體映像工具
jmap(Memory Map for Java)指令用于生成堆轉儲快照(一般稱為heapdump或dump檔案)。 jmap的作用并不僅僅是為了擷取dump檔案,它還可以查詢finalize執行隊列、Java堆和永久代的詳細資訊,如空間使用率、目前用的那種收集器等。 jmap指令格式 jmap [options] vmid
如通過jps -vl 首先查詢到eclipse的vmid為547,讓後檢視547的堆詳細資訊。指令及圖如下: jps -vl jmap -heap 547
3.2.5 jhat:虛拟機堆轉儲快照分析工具
Sun JDK提供jhat(JVM Heap Analysis Tool)指令與jmap搭配使用,來分析jmap生成的堆轉儲快照。 但一般不推薦使用,一是不會在應用伺服器上直接分析dump檔案,耗時且吃硬體資源,二是jhat的分析功能相對簡陋。
3.2.6 jstack:Java堆棧跟蹤工具
jstack(Stack Trace for Java)指令用于生成虛拟機目前時刻的線程快照(一般稱為threaddump或javacore檔案)。線程快照就是目前虛拟機内每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的就是定位線程出現長時間停頓的原因,如線程間死鎖、死鎖循環、請求外部資源導緻的長時間等待等都是導緻線程長時間停頓的常見原因。線程出現停頓的時候通過jstack來檢視各個線程的調用堆棧,就是知道沒有響應的線程到底在背景做些什麼事情,或者等待什麼資源。 jstack指令格式: jstack [options] vmid 如jstack -l 547。options選項如下:
3.3 JDK的可視化工具
JConsole(Java Monitoring and Management Console)是一種基于JMX的可視化監視、管理工具。通過JDK/bin目錄下的“jconsole.exe”啟動。 VisuaIVM(All-in-one Java Troubleshooting Tool)是目前功能最強大的運作監視和故障處理程式,基于NetBeans平台開發,具備了插件擴充功能的特性,通過擴充擴充支援,VisuaIVM可以做到: (1)顯示虛拟機程序以及程序的配置、環境資訊(jps,jinfo) (2)監視應用程式的CPU、GC、堆、方法區以及線程的資訊(jstat、jstack) (3)dump以及分析堆轉儲快照(jmap、jhat)
(4)方法級的程式運作性能分析,找出被調用最多、運作時間最長的方法
(5)離線程式快照:收集程式的運作時配置、線程dump、記憶體dump等資訊建立一個快照,可以将快照發送開發者處進行Bug回報
(6)其它plugins的無限的可能性