文章同步釋出于github部落格位址,閱讀效果更佳,歡迎品嘗
運用jvm自帶的指令可以友善的在生産監控和列印堆棧的日志資訊幫忙我們來定位問題!雖然jvm調優成熟的工具已經有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生産環境出現問題的時候,一方面工具的使用會有所限制,另一方面喜歡裝X的我們,總喜歡在出現問題的時候在終端輸入一些指令來解決。所有的工具幾乎都是依賴于jdk的接口和底層的這些指令,研究這些指令的使用也讓我們更能了解jvm構成和特性。
Sun JDK監控和故障處理指令有jps jstat jmap jhat jstack jinfo下面做一一介紹
JVM Process Status Tool,顯示指定系統内所有的HotSpot虛拟機程序。
-l : 輸出主類全名或jar路徑 -q : 隻輸出LVMID -m : 輸出JVM啟動時傳遞給main()的參數 -v : 輸出JVM啟動時顯示指定的JVM參數
其中[option]、[hostid]參數也可以不寫。
jstat(JVM statistics Monitoring)是用于監視虛拟機運作時狀态資訊的指令,它可以顯示出虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料。
[option] : 操作參數 LVMID : 本地虛拟機程序ID [interval] : 連續輸出的時間間隔 [count] : 連續輸出的次數
Option
Displays…
class
class loader的行為統計。Statistics on the behavior of the class loader.
compiler
HotSpt JIT編譯器行為統計。Statistics of the behavior of the HotSpot Just-in-Time compiler.
gc
垃圾回收堆的行為統計。Statistics of the behavior of the garbage collected heap.
gccapacity
各個垃圾回收代容量(young,old,perm)和他們相應的空間統計。Statistics of the capacities of the generations and their corresponding spaces.
gcutil
垃圾回收統計概述。Summary of garbage collection statistics.
gccause
垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and
gcnew
新生代行為統計。Statistics of the behavior of the new generation.
gcnewcapacity
新生代與其相應的記憶體空間的統計。Statistics of the sizes of the new generations and its corresponding spaces.
gcold
年老代和永生代行為統計。Statistics of the behavior of the old and permanent generations.
gcoldcapacity
年老代行為統計。Statistics of the sizes of the old generation.
gcpermcapacity
永生代行為統計。Statistics of the sizes of the permanent generation.
printcompilation
HotSpot編譯方法統計。HotSpot compilation method statistics.
監視類裝載、解除安裝數量、總空間以及耗費的時間
Loaded : 加載class的數量 Bytes : class位元組大小 Unloaded : 未加載class的數量 Bytes : 未加載class的位元組大小 Time : 加載時間
輸出JIT編譯過的方法數量耗時等
Compiled : 編譯數量 Failed : 編譯失敗數量 Invalid : 無效數量 Time : 編譯耗時 FailedType : 失敗類型 FailedMethod : 失敗方法的全限定名
垃圾回收堆的行為統計,常用指令
C即Capacity 總容量,U即Used 已使用的容量
S0C : survivor0區的總容量 S1C : survivor1區的總容量 S0U : survivor0區已使用的容量 S1C : survivor1區已使用的容量 EC : Eden區的總容量 EU : Eden區已使用的容量 OC : Old區的總容量 OU : Old區已使用的容量 PC 目前perm的容量 (KB) PU perm的使用 (KB) YGC : 新生代垃圾回收次數 YGCT : 新生代垃圾回收時間 FGC : 老年代垃圾回收次數 FGCT : 老年代垃圾回收時間 GCT : 垃圾回收總消耗時間
這個指令意思就是每隔2000ms輸出1262的gc情況,一共輸出20次
同-gc,不過還會輸出Java堆各區域使用到的最大、最小空間
NGCMN : 新生代占用的最小空間 NGCMX : 新生代占用的最大空間 OGCMN : 老年代占用的最小空間 OGCMX : 老年代占用的最大空間 OGC:目前年老代的容量 (KB) OC:目前年老代的空間 (KB) PGCMN : perm占用的最小空間 PGCMX : perm占用的最大空間
同-gc,不過輸出的是已使用空間占總空間的百分比
垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的原因
LGCC:最近垃圾回收的原因 GCC:目前垃圾回收的原因
統計新生代的行為
TT:Tenuring threshold(提升門檻值) MTT:最大的tenuring threshold DSS:survivor區域大小 (KB)
新生代與其相應的記憶體空間的統計
NGC:目前年輕代的容量 (KB) S0CMX:最大的S0空間 (KB) S0C:目前S0空間 (KB) ECMX:最大eden空間 (KB) EC:目前eden空間 (KB)
統計舊生代的行為
統計舊生代的大小和空間
永生代行為統計
hotspot編譯方法統計
Compiled:被執行的編譯任務的數量 Size:方法位元組碼的位元組數 Type:編譯類型 Method:編譯方法的類名和方法名。類名使用"/" 代替 "." 作為空間分隔符. 方法名是給出類的方法名. 格式是一緻于HotSpot - XX:+PrintComplation 選項
jmap(JVM Memory Map)指令用于生成heap dump檔案,如果不使用這個指令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛拟機出現OOM的時候·自動生成dump檔案。
jmap不僅能生成dump檔案,還闊以查詢finalize執行隊列、Java堆和永久代的詳細資訊,如目前使用率、目前使用的是哪種收集器等。
dump : 生成堆轉儲快照 finalizerinfo : 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象 heap : 顯示Java堆詳細資訊 histo : 顯示堆中對象的統計資訊 permstat : to print permanent generation statistics F : 當-dump沒有響應時,強制生成dump快照
常用格式
dump堆到檔案,format指定輸出格式,live指明是活着的對象,file指定檔案名
dump.hprof這個字尾是為了後續可以直接用MAT(Memory Anlysis Tool)打開。
列印等待回收對象的資訊
可以看到目前F-QUEUE隊列中并沒有等待Finalizer線程執行finalizer方法的對象。
列印heap的概要資訊,GC使用的算法,heap的配置及wise heap的使用情況,可以用此來判斷記憶體目前的使用情況以及垃圾回收情況
可以很清楚的看到Java堆中各個區域目前的情況。
列印堆的對象統計,包括對象數、記憶體大小等等 (因為在dump:live前會進行full gc,如果帶上live則隻統計活對象,是以不加live的堆大小要大于加live堆的大小 )
僅僅列印了前10行
<code>xml class name</code>是對象類型,說明如下:
列印Java堆記憶體的永久儲存區域的類加載器的智能統計資訊。對于每個類加載器而言,它的名稱、活躍度、位址、父類加載器、它所加載的類的數量和大小都會被列印。此外,包含的字元串數量和大小也會被列印。
強制模式。如果指定的pid沒有響應,請使用jmap -dump或jmap -histo選項。此模式下,不支援live子選項。
jhat(JVM Heap Analysis Tool)指令是與jmap搭配使用,用來分析jmap生成的dump,jhat内置了一個微型的HTTP/HTML伺服器,生成dump的分析結果後,可以在浏覽器中檢視。在此要注意,一般不會直接在伺服器上進行分析,因為jhat是一個耗時并且耗費硬體資源的過程,一般把伺服器生成的dump檔案複制到本地或其他機器上進行分析。
-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.
中間的-J-Xmx512m是在dump快照很大的情況下配置設定512M記憶體去啟動HTTP伺服器,運作完之後就可在浏覽器打開Http://localhost:7000進行快照分析
堆快照分析主要在最後面的Heap Histogram裡,裡面根據class列出了dump的時候所有存活對象。
分析同樣一個dump快照,MAT需要的額外記憶體比jhat要小的多的多,是以建議使用MAT來進行分析,當然也看個人偏好。
打開浏覽器Http://localhost:7000,該頁面提供了幾個查詢功能可供使用:
一般檢視堆異常情況主要看這個兩個部分:
Show instance counts for all classes (excluding platform),平台外的所有對象資訊。如下圖:
Show heap histogram 以樹狀圖形式展示堆情況。如下圖:
具體排查時需要結合代碼,觀察是否大量應該被回收的對象在一直被引用或者是否有占用記憶體特别大的對象無法被回收。
一般情況,會down到用戶端用工具來分析
jstack用于生成java虛拟機目前時刻的線程快照。線程快照是目前java虛拟機内每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導緻的長時間等待等。 線程出現停頓的時候通過jstack來檢視各個線程的調用堆棧,就可以知道沒有響應的線程到底在背景做什麼事情,或者等待什麼資源。 如果java程式崩潰生成core檔案,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,進而可以輕松地知道java程式是如何崩潰和在程式何處發生問題。另外,jstack工具還可以附屬到正在運作的java程式中,看到當時運作的java程式的java stack和native stack的資訊, 如果現在運作的java程式呈現hung的狀态,jstack是非常有用的。
-F : 當正常輸出請求不被響應時,強制輸出線程堆棧 -l : 除堆棧外,顯示關于鎖的附加資訊 -m : 如果調用到本地方法的話,可以顯示C/C++的堆棧
這裡有一篇文章解釋的很好
分析列印出的檔案内容
jinfo(JVM Configuration info)這個指令作用是實時檢視和調整虛拟機運作參數。
之前的jps -v密碼隻能檢視到顯示指定的參數,如果想要檢視未被顯示指定的參數的值就要使用jinfo密碼
-flag : 輸出指定args參數的值 -flags : 不需要args參數,輸出所有JVM參數的值 -sysprops : 輸出系統屬性,等同于System.getProperties()
作者:純潔的微笑
出處:www.ityouknow.com
資源:微信搜【純潔的微笑】關注我,回複 【程式員】【面試】【架構師】有我準備的一線程式必備計算機書籍、大廠面試資料和免費電子書。 一共1024G的資料,希望可以幫助大家提升技術和能力。
本文如對您有幫助,還請多幫 【推薦】 下此文。
點我了解:Tooool-程式員一站式導航網站