一、jvm工具
1.jps:虛擬機進程狀況工具(JVM Process Status Tool)
a).命令格式: jps [options] [hostid]
b).-l:輸出主類全名或jar路徑
-q:只輸出LVMID
-m: 輸出jvm啓動時傳遞給main()的參數
-v: 輸出jvm啓動時顯示指定的jvm參數
2.jstat:虛擬機統計信息監視工具(JVM statistics Monitoring)
a).顯示出虛擬機中的類裝載、內存、垃圾收集器、JIT編譯等運行數據
b).命令格式: jstat [option vmid [interval[s|ms] [count] ] ]
c).參數interval和count代表查詢間隔和次數,如果省略,說明查詢一次
d).舉例:假如沒250毫秒查詢一次進程2764垃圾收集狀況,共查詢20次
jstat -gc 2764 250 20
e).選項option,代表需要查詢的虛擬機的信息。主要分爲3類:類裝載、垃圾收集、運行期編譯狀況
f).
選項 作用
-class 監視類裝載、卸載數量、總空間以及類裝載所耗費的時間
-gc 監視Java堆狀況,包括Eden區、兩個Survivor區、老年代、永久代等的容量、 已用空間、GC時間合計等信息
-gccapacity 監視內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間
-gcutil 監視內容與-gc基本相同,但輸出主要關注已使用空間佔總空間的百分比
-gccause 與 -gcutil 功能一樣,但是會額外輸出導致上一次GC產生的原因
-gcnew 監視新生代GC狀況
-gcnewcapacity 監視內容與 -gcnew 基本相同,輸出主要關注使用到的最大、最小空間
-gcold 監視老年代GC狀況
-gcoldcapacity 監視內容與 -gcold 基本相同,輸出主要關注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大、最小空間
-compiler 輸出JIT編譯器編譯過的方法、耗時等信息
-printcompilation 輸出已經被JIT編譯的方法
3.jmap:java內存印象工具(JVM Memory Map)
a).命令用於生成heap dump文件,如果不使用這個命令,還闊以使用-XX: +HeapDumpOnOutOfMemoryError參數來讓虛擬機出現OOM的時候·自動生成dump文件。 jmap不僅能生成dump文件,還闊以查詢finalize執行隊列、Java堆和永久代的詳細信息,如當前使用率、當前使用的是哪種收集器等。
b).命令格式:jmap [option] vmid
c).選項 作用
-dump 生成堆轉儲快照
-finalizerinfo 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
-heap 顯示Java堆詳細信息
-histo 顯示堆中對象的統計信息
-permstat 以ClassLoader爲統計口徑顯示永久代內存狀態。只在Linux/Solaris平臺下有效
-F 當-dump沒有響應時,強制生成dump快照
4.jhat虛擬機堆轉儲快照分析工具(JVM head Analysis Tool)
a).命令是與jmap搭配使用,用來分析jmap生成的dump,jhat內置了一個微型的HTTP/HTML服務器,生成dump的分析結果後,可以在瀏覽器中查看。在此要注意,一般不會直接在服務器上進行分析,因爲jhat是一個耗時並且耗費硬件資源的過程,一般把服務器生成的dump文件複製到本地或其他機器上進行分析。
b).命令格式:jhat [option] [dumpfile]
c).選項 作用
-stack false|true 關閉對象分配調用棧跟蹤(tracking object allocation call stack)。 如果分配位置信息在堆轉儲中不可用. 則必須將此標誌設置爲 false. 默認值爲 true.
-refs false|true 關閉對象引用跟蹤(tracking of references to objects)。 默認值爲 true. 默認情況下, 返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用(referrers or incoming references), 會統計/計算堆中的所有對象。
-port port-number 設置 jhat HTTP server 的端口號. 默認值 7000.
-exclude exclude-file 指定對象查詢時需要排除的數據成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除。
-baseline exclude-file 指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記爲不是新的(marked as not being new). 其他對象被標記爲新的(new). 在比較兩個不同的堆轉儲時很有用.
-debug int 設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息.
-version 啓動後只顯示版本信息就退出
-J< flag > 因爲 jhat 命令實際上會啓動一個JVM來執行, 通過 -J 可以在啓動JVM時傳入一些啓動參數. 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存爲 512 MB. 如果需要使用多個JVM啓動參數,則傳入多個 -Jxxxxxx.
5.jstack:java堆棧跟蹤工具
a).命令格式: jstack [option] vmid
b).參數選項:-F:當正常輸出請求不被響應時,強制輸出線程堆棧。
-l :除堆棧外,顯示關於鎖的附加信息
-m:如果調用到本地方法的話,可以顯示c/c++的堆棧
6.jinfo:java配置信息工具(JVM Configuration info)
a).實時查看和調整虛擬機運行參數,之前的jps -v口令只能查看到顯示指定的參數,如果想要查看未被顯示指定的參數的值就要使用jinfo口令。
b).命令格式: jinfo [option] pid
c).選項:-flag :輸出指定args參數的值
-flags:不需要args參數,輸出所以jvm參數的值
-sysprops:輸出系統屬性,等同於System.getProperties()
實現:這些命令行工具大多是jdk/lib/tools.jar類庫的包裝。主要代碼是早tool類庫中實現
二、調優分析內容
1.運行日誌
2.異常堆棧
3.GC日誌
4.線程快照(threaddump/javacore文件)、堆轉儲快照(heapdump/hprof文件)等。
獲取更多學習資料,面試題以及視頻,關注微信公衆號: