linux jstat 命令监控gc情况
jstat?
?
Jstat用于監控基于HotSpot的JVM,對其堆的使用情況進行實時的命令行的統計,使用jstat我們可以對指定的JVM做如下監控:
- 類的加載及卸載情況
- 查看新生代、老生代及持久代的容量及使用情況
- 查看新生代、老生代及持久代的垃圾收集情況,包括垃圾回收的次數及垃圾回收所占用的時間
- 查看新生代中Eden區及Survior區中容量及分配情況等
jstat工具特別強大,它有眾多的可選項,通過提供多種不同的監控維度,使我們可以從不同的維度來了解到當前JVM堆的使用情況。詳細查看堆內各個部分的使用量,使用的時候必須加上待統計的Java進程號,可選的不同維度參數以及可選的統計頻率參數。
?jstat?[?generalOption?|?outputOptions?vmid?[interval[s|ms]?[count]]?]
??? generalOption - 單個的常用的命令行選項,如-help,?-options,?或?-version。
?
??? outputOptions -一個或多個輸出選項,由單個的statOption選項組成,可以和-t,?-h,?and?-J等選項配合使用。
?
????statOption:
?
??? 根據jstat統計的維度不同,可以使用如下表中的選項進行不同維度的統計,不同的操作系統支持的選項可能會不一樣,可以通過-options選項,查看不同操作系統所支持選項,如:
?
| class | 用于查看類加載情況的統計 |
| compiler | 用于查看HotSpot中即時編譯器編譯情況的統計 |
| gc | 用于查看JVM中堆的垃圾收集情況的統計 |
| gccapacity | 用于查看新生代、老生代及持久代的存儲容量情況 |
| gccause | 用于查看垃圾收集的統計情況(這個和-gcutil選項一樣),如果有發生垃圾收集,它還會顯示最后一次及當前正在發生垃圾收集的原因。 |
| gcnew | 用于查看新生代垃圾收集的情況 |
| gcnewcapacity | 用于查看新生代的存儲容量情況 |
| gcold | 用于查看老生代及持久代發生GC的情況 |
| gcoldcapacity | 用于查看老生代的容量 |
| gcpermcapacity | 用于查看持久代的容量 |
| gcutil | 用于查看新生代、老生代及持代垃圾收集的情況 |
| printcompilation | HotSpot編譯方法的統計 |
??? -h n
??????? 用于指定每隔幾行就輸出列頭,如果不指定,默認是只在第一行出現列頭。
?
??? -JjavaOption
?
??????? 用于將給定的javaOption傳給java應用程序加載器,例如,“-J-Xms48m”將把啟動內存設置為48M。如果想查看可以傳遞哪些選項到應用程序加載器中,可以相看如下的文檔:
?
??????? Linux and Solaris:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html
?
??????? Windows: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html
?
??? -t n
?
??????? 用于在輸出內容的第一列顯示時間戳,這個時間戳代表的時JVM開始啟動到現在的時間(注:在IBM JDK5中是沒有這個選項的)。
?
?
?
??? vmid? -?VM的進程號,即當前運行的java進程號。
?
??? 還有兩個關于顯示頻率的選項:
?
??? interval–間隔時間,單位可以是秒或者毫秒,通過指定s或ms確定,默認單位為毫秒。
?
??? count-打印次數,如果缺省則打印無數次。
?
3、不同的統計維度(statOption)及輸出說明
??? -class
| Loaded | 加載了的類的數量 |
| Bytes | 加載了的類的大小,單為Kb |
| Unloaded | 卸載了的類的數量 |
| Bytes | 卸載了的類的大小,單為Kb |
| Time | 花在類的加載及卸載的時間 |
?
???? -compiler
?
| Compiled | 編譯任務執行的次數 |
| Failed | 編譯任務執行失敗的次數 |
| Invalid | 編譯任務非法執行的次數 |
| Time | 執行編譯花費的時間 |
| FailedType | 最后一次編譯失敗的編譯類型 |
| FailedMethod | 最后一次編譯失敗的類名及方法名 |
?
???? -gc
?
| S0C | 新生代中Survivor space中S0當前容量的大小(KB) |
| S1C | 新生代中Survivor space中S1當前容量的大小(KB) |
| S0U | 新生代中Survivor space中S0容量使用的大小(KB) |
| S1U | 新生代中Survivor space中S1容量使用的大小(KB) |
| EC | Eden space當前容量的大小(KB) |
| EU | Eden space容量使用的大小(KB) |
| OC | Old space當前容量的大小(KB) |
| OU | Old space使用容量的大小(KB) |
| PC | Permanent space當前容量的大小(KB) |
| PU | Permanent space使用容量的大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| YGCT | 從應用程序啟動到采樣時 Young GC 所用的時間(秒) |
| FGC | 從應用程序啟動到采樣時發生 Full GC 的次數 |
| FGCT | 從應用程序啟動到采樣時 Full GC 所用的時間(秒) |
| GCT | T從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒),它的值等于YGC+FGC |
?
??? -gccapacity
?
| NGCMN | 新生代的最小容量大小(KB) |
| NGCMX | 新生代的最大容量大小(KB) |
| NGC | 當前新生代的容量大小(KB) |
| S0C | 當前新生代中survivor space 0的容量大小(KB) |
| S1C | 當前新生代中survivor space 1的容量大小(KB) |
| EC | Eden space當前容量的大小(KB) |
| OGCMN | 老生代的最小容量大小(KB) |
| OGCMX | 老生代的最大容量大小(KB) |
| OGC | 當前老生代的容量大小(KB) |
| OC | 當前老生代的空間容量大小(KB) |
| PGCMN | 持久代的最小容量大小(KB) |
| PGCMX | 持久代的最大容量大小(KB) |
| PGC | 當前持久代的容量大小(KB) |
| PC | 當前持久代的空間容量大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| FGC | 從應用程序啟動到采樣時發生 Full GC 的次數 |
?
??? -gccause
?
???? 這個選項用于查看垃圾收集的統計情況(這個和-gcutil選項一樣),如果有發生垃圾收集,它還會顯示最后一次及當前正在發生垃圾收集的原因,它比-gcutil會多出最后一次垃圾收集原因以及當前正在發生的垃圾收集的原因。
?
| LGCC | 最后一次垃圾收集的原因,可能為“unknown GCCause”、“System.gc()”等 |
| GCC | 當前垃圾收集的原因 |
?
?
??? -gcnew
?
| S0C | 當前新生代中survivor space 0的容量大小(KB) |
| S1C | 當前新生代中survivor space 1的容量大小(KB) |
| S0U | S0已經使用的大小(KB) |
| S1U | S1已經使用的大小(KB) |
| TT | Tenuring threshold,要了解這個參數,我們需要了解一點Java內存對象的結構,在Sun JVM中,(除了數組之外的)對象都有兩個機器字(words)的頭部。第一個字中包含這個對象的標示哈希碼以及其他一些類似鎖狀態和等標識信息,第二個字中包含一個指向對象的類的引用,其中第二個字節就會被垃圾收集算法使用到。 在新生代中做垃圾收集的時候,每次復制一個對象后,將增加這個對象的收集計數,當一個對象在新生代中被復制了一定次數后,該算法即判定該對象是長周期的對象,把他移動到老生代,這個閾值叫著tenuring threshold。這個閾值用于表示某個/些在執行批定次數youngGC后還活著的對象,即使此時新生的的Survior沒有滿,也同樣被認為是長周期對象,將會被移到老生代中。 |
| MTT | Maximum tenuring threshold,用于表示TT的最大值。 |
| DSS | Desired survivor size (KB).可以參與這里:http://blog.csdn.net/yangjun2/article/details/6542357 |
| EC | Eden space當前容量的大小(KB) |
| EU | Eden space已經使用的大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| YGCT | 從應用程序啟動到采樣時 Young GC 所用的時間(單位秒) |
?
??? -gcnewcapacity
?
| NGCMN?????????? | 新生代的最小容量大小(KB) |
| NGCMX ??? | 新生代的最大容量大小(KB) |
| NGC ??? | 當前新生代的容量大小(KB) |
| S0CMX | 新生代中SO的最大容量大小(KB) |
| S0C | 當前新生代中SO的容量大小(KB) |
| S1CMX | 新生代中S1的最大容量大小(KB) |
| S1C | 當前新生代中S1的容量大小(KB) |
| ECMX | 新生代中Eden的最大容量大小(KB) |
| EC | 當前新生代中Eden的容量大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| FGC | 從應用程序啟動到采樣時發生 Full GC 的次數 |
?
??? -gcold
?
| PC | 當前持久代容量的大小(KB) |
| PU | 持久代使用容量的大小(KB) |
| OC | 當前老年代容量的大小(KB) |
| OU | 老年代使用容量的大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| FGC | 從應用程序啟動到采樣時發生 Full GC 的次數 |
| FGCT | 從應用程序啟動到采樣時 Full GC 所用的時間(單位秒) |
| GCT | 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒),它的值等于YGC+FGC |
?
??? -gcoldcapacity
?
| OGCMN | 老生代的最小容量大小(KB) |
| OGCMX | 老生代的最大容量大小(KB) |
| OGC | 當前老生代的容量大小(KB) |
| OC | 當前新生代的空間容量大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| FGC | 從應用程序啟動到采樣時發生 Full GC 的次數 |
| FGCT | 從應用程序啟動到采樣時 Full GC 所用的時間(單位秒) |
| GCT | 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒),它的值等于YGC+FGC |
?
??? -gcpermcapacity
??? 從應用程序啟動到采樣時發生 Full GC 的次數
| PGCMN | 持久代的最小容量大小(KB) |
| PGCMX | 持久代的最大容量大小(KB) |
| PGC | 當前持久代的容量大小(KB) |
| PC | 當前持久代的空間容量大小(KB) |
| YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
| FGC | |
| FGCT | 從應用程序啟動到采樣時 Full GC 所用的時間(單位秒) |
| GCT | 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒),它的值等于YGC+FGC |
?
??? -gcutil
?
| S0 | Heap上的?Survivor?space?0?區已使用空間的百分比 |
| S1 | Heap上的?Survivor?space?1?區已使用空間的百分比 |
| E | Heap上的?Eden?space?區已使用空間的百分比 |
| O | Heap上的?Old?space?區已使用空間的百分比 |
| P | Perm?space?區已使用空間的百分比 |
| YGC | 從應用程序啟動到采樣時發生?Young?GC?的次數 |
| YGCT | 從應用程序啟動到采樣時?Young?GC?所用的時間(單位秒) |
| FGC | 從應用程序啟動到采樣時發生?Full?GC?的次數 |
| FGCT | 從應用程序啟動到采樣時?Full?GC?所用的時間(單位秒) |
| GCT | 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒),它的值等于YGC+FGC |
?
??? -printcompilation
?
| Compiled | 編譯任務執行的次數 |
| Size | 方法的字節碼所占的字節數 |
| Type | 編譯類型 |
| Method | 指定確定被編譯方法的類名及方法名,類名中使名“/”而不是“.”做為命名分隔符,方法名是被指定的類中的方法,這兩個字段的格式是由HotSpot中的“-XX:+PrintComplation”選項確定的。 |
?
4、使用示例
?
示例1)、
?
?
示例2):
?
?
?
圖中同時打印了young?gc和full?gc的總次數、總耗時。而,每次young?gc消耗的時間,可以用相間隔的兩行YGCT相減得到。每次full?gc消耗的時間,可以用相隔的兩行FGCT相減得到。例如紅框中表示的第一行、第二行之間發生了1次young?gc,消耗的時間為0.252-0.252=0.0秒。
?
常駐內存區(P)的使用率,始終停留在64.21%左右,說明常駐內存沒有突變,比較正常。如果young?gc和full?gc能夠正常發生,而且都能有效回收內存,常駐內存區變化不明顯,則說明java內存釋放情況正常,垃圾回收及時,java內存泄露的幾率就會大大降低。但也不能說明一定沒有內存泄露。
?
示例3)、
?
?
??? 以上,介紹了Jstat按百分比查看gc情況的功能。其實,它還有功能,例如加載類信息統計功能、內存池信息統計功能等,那些是以絕對值的形式打印出來的,比較少用,在此就不做介紹。
?
示例4)、jstat?-class?pid:顯示加載class的數量,及所占空間等信息。
?
?
?示例5)、jstat?-compiler?pid:顯示VM實時編譯的數量等信息。
?
?
?????? 1. jstat -gc pid?
??????????? 可以顯示gc的信息,查看gc的次數,及時間。?
??????????? 其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。?
????? 2.jstat -gccapacity pid?
??????????? 可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,?
??????????? 如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,?
??????????? PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。?
??????????? 其他的可以根據這個類推, OC是old內純的占用量。?
???? 3.jstat -gcutil pid?
??????????? 統計gc信息統計。?
???? 4.jstat -gcnew pid?
?????????? 年輕代對象的信息。?
???? 5.jstat -gcnewcapacity pid?
?????????? 年輕代對象的信息及其占用量。?
???? 6.jstat -gcold pid?
????????? old代對象的信息。?
???? 7.stat -gcoldcapacity pid?
????????? old代對象的信息及其占用量。?
???? 8.jstat -gcpermcapacity pid?
????????? perm對象的信息及其占用量。?
???? 9.jstat -class pid?
????????? 顯示加載class的數量,及所占空間等信息。?
???? 10.jstat -compiler pid?
????????? 顯示VM實時編譯的數量等信息。?
???? 11.stat -printcompilation pid?
????????? 當前VM執行的信息。?
??????? 一些術語的中文解釋:?
???????? S0C:年輕代中第一個survivor(幸存區)的容量 (字節)?
???????? S1C:年輕代中第二個survivor(幸存區)的容量 (字節)?
???????? S0U:年輕代中第一個survivor(幸存區)目前已使用空間 (字節)?
???????? S1U:年輕代中第二個survivor(幸存區)目前已使用空間 (字節)?
???????? EC:年輕代中Eden(伊甸園)的容量 (字節)?
???????? EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)?
???????? OC:Old代的容量 (字節)?
???????? OU:Old代目前已使用空間 (字節)?
???????? PC:Perm(持久代)的容量 (字節)?
???????? PU:Perm(持久代)目前已使用空間 (字節)?
???????? YGC:從應用程序啟動到采樣時年輕代中gc次數?
???????? YGCT:從應用程序啟動到采樣時年輕代中gc所用時間(s)?
???????? FGC:從應用程序啟動到采樣時old代(全gc)gc次數?
???????? FGCT:從應用程序啟動到采樣時old代(全gc)gc所用時間(s)?
???????? GCT:從應用程序啟動到采樣時gc用的總時間(s)?
???????? NGCMN:年輕代(young)中初始化(最小)的大小 (字節)?
???????? NGCMX:年輕代(young)的最大容量 (字節)?
???????? NGC:年輕代(young)中當前的容量 (字節)?
???????? OGCMN:old代中初始化(最小)的大小 (字節)?
???????? OGCMX:old代的最大容量 (字節)?
???????? OGC:old代當前新生成的容量 (字節)?
???????? PGCMN:perm代中初始化(最小)的大小 (字節)?
???????? PGCMX:perm代的最大容量 (字節)???
???????? PGC:perm代當前新生成的容量 (字節)?
???????? S0:年輕代中第一個survivor(幸存區)已使用的占當前容量百分比?
???????? S1:年輕代中第二個survivor(幸存區)已使用的占當前容量百分比?
???????? E:年輕代中Eden(伊甸園)已使用的占當前容量百分比?
???????? O:old代已使用的占當前容量百分比?
???????? P:perm代已使用的占當前容量百分比?
???????? S0CMX:年輕代中第一個survivor(幸存區)的最大容量 (字節)?
???????? S1CMX :年輕代中第二個survivor(幸存區)的最大容量 (字節)?
???????? ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)?
???????? DSS:當前需要survivor(幸存區)的容量 (字節)(Eden區已滿)?
???????? TT: 持有次數限制?
???????? MTT : 最大持有次數限制?
轉載于:https://www.cnblogs.com/pdca/p/4684113.html
總結
以上是生活随笔為你收集整理的linux jstat 命令监控gc情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重构alert,confirm
- 下一篇: Map Set list 理解