運用jvm自帶的命令能夠方便的在生產監控和打印堆棧的日誌信息幫忙咱們來定位問題!雖然jvm調優成熟的工具已經有不少:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,可是在生產環境出現問題的時候,一方面工具的使用會有所限制,另外一方面喜歡裝X的咱們,總喜歡在出現問題的時候在終端輸入一些命令來解決。全部的工具幾乎都是依賴於jdk的接口和底層的這些命令,研究這些命令的使用也讓咱們更能瞭解jvm構成和特性。java
Sun JDK監控和故障處理命令有jps jstat jmap jhat jstack jinfo下面作一一介紹算法
JVM Process Status Tool,顯示指定系統內全部的HotSpot虛擬機進程。apache
jps [options] [hostid]
- -l : 輸出主類全名或jar路徑
- -q : 只輸出LVMID
- -m : 輸出JVM啓動時傳遞給main()的參數
- -v : 輸出JVM啓動時顯示指定的JVM參數
其中[option]、[hostid]參數也能夠不寫。bootstrap
$ jps -l -m
28920 org.apache.catalina.startup.Bootstrap start
11589 org.apache.catalina.startup.Bootstrap start
25816 sun.tools.jps.Jps -l -m
jstat(JVM statistics Monitoring)是用於監視虛擬機運行時狀態信息的命令,它能夠顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。數組
jstat [option] LVMID [interval] [count]
- [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. |
監視類裝載、卸載數量、總空間以及耗費的時間瀏覽器
$ jstat -class 11589
Loaded Bytes Unloaded Bytes Time
7035 14506.3 0 0.0 3.67
- Loaded : 加載class的數量
- Bytes : class字節大小
- Unloaded : 未加載class的數量
- Bytes : 未加載class的字節大小
- Time : 加載時間
輸出JIT編譯過的方法數量耗時等tomcat
$ jstat -compiler 1262
Compiled Failed Invalid Time FailedType FailedMethod
2573 1 0 47.60 1 org/apache/catalina/loader/WebappClassLoader findResourceInternal
- Compiled : 編譯數量
- Failed : 編譯失敗數量
- Invalid : 無效數量
- Time : 編譯耗時
- FailedType : 失敗類型
- FailedMethod : 失敗方法的全限定名
垃圾回收堆的行爲統計,經常使用命令服務器
$ jstat -gc 1262
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
26112.0 24064.0 6562.5 0.0 564224.0 76274.5 434176.0 388518.3 524288.0 42724.7 320 6.417 1 0.398 6.815
C即Capacity 總容量,U即Used 已使用的容量app
- S0C : survivor0區的總容量
- S1C : survivor1區的總容量
- S0U : survivor0區已使用的容量
- S1U : survivor1區已使用的容量
- EC : Eden區的總容量
- EU : Eden區已使用的容量
- OC : Old區的總容量
- OU : Old區已使用的容量
- PC 當前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次數
- YGCT : 新生代垃圾回收時間
- FGC : 老年代垃圾回收次數
- FGCT : 老年代垃圾回收時間
- GCT : 垃圾回收總消耗時間
$ jstat -gc 1262 2000 20
這個命令意思就是每隔2000ms輸出1262的gc狀況,一共輸出20次jvm
同-gc,不過還會輸出Java堆各區域使用到的最大、最小空間
$ jstat -gccapacity 1262
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
614400.0 614400.0 614400.0 26112.0 24064.0 564224.0 434176.0 434176.0 434176.0 434176.0 524288.0 1048576.0 524288.0 524288.0 320 1
- NGCMN : 新生代佔用的最小空間
- NGCMX : 新生代佔用的最大空間
- OGCMN : 老年代佔用的最小空間
- OGCMX : 老年代佔用的最大空間
- OGC:當前年老代的容量 (KB)
- OC:當前年老代的空間 (KB)
- PGCMN : perm佔用的最小空間
- PGCMX : perm佔用的最大空間
同-gc,不過輸出的是已使用空間佔總空間的百分比
$ jstat -gcutil 28920
S0 S1 E O P YGC YGCT FGC FGCT GCT
12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242
垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的緣由
$ jstat -gccause 28920
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
12.45 0.00 33.85 0.00 4.44 4 0.242 0 0.000 0.242 Allocation Failure No GC
- LGCC:最近垃圾回收的緣由
- GCC:當前垃圾回收的緣由
統計新生代的行爲
$ jstat -gcnew 28920
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
419392.0 419392.0 52231.8 0.0 6 6 209696.0 3355520.0 1172246.0 4 0.242
- TT:Tenuring threshold(提高閾值)
- MTT:最大的tenuring threshold
- DSS:survivor區域大小 (KB)
新生代與其相應的內存空間的統計
$ jstat -gcnewcapacity 28920
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
4194304.0 4194304.0 4194304.0 419392.0 419392.0 419392.0 419392.0 3355520.0 3355520.0 4 0
- NGC:當前年輕代的容量 (KB)
- S0CMX:最大的S0空間 (KB)
- S0C:當前S0空間 (KB)
- ECMX:最大eden空間 (KB)
- EC:當前eden空間 (KB)
統計舊生代的行爲
$ jstat -gcold 28920
PC PU OC OU YGC FGC FGCT GCT
1048576.0 46561.7 6291456.0 0.0 4 0 0.000 0.242
統計舊生代的大小和空間
$ jstat -gcoldcapacity 28920
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
6291456.0 6291456.0 6291456.0 6291456.0 4 0 0.000 0.242
永生代行爲統計
$ jstat -gcpermcapacity 28920
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
1048576.0 2097152.0 1048576.0 1048576.0 4 0 0.000 0.242
hotspot編譯方法統計
$ jstat -printcompilation 28920
Compiled Size Type Method
1291 78 1 java/util/ArrayList indexOf
- Compiled:被執行的編譯任務的數量
- Size:方法字節碼的字節數
- Type:編譯類型
- Method:編譯方法的類名和方法名。類名使用」/」 代替 「.」 做爲空間分隔符. 方法名是給出類的方法名. 格式是一致於HotSpot - XX:+PrintComplation 選項
jmap(JVM Memory Map)命令用於生成heap dump文件,若是不使用這個命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛擬機出現OOM的時候·自動生成dump文件。 jmap不只能生成dump文件,還闊以查詢finalize執行隊列、Java堆和永久代的詳細信息,如當前使用率、當前使用的是哪一種收集器等。
jmap [option] LVMID
- dump : 生成堆轉儲快照
- finalizerinfo : 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
- heap : 顯示Java堆詳細信息
- histo : 顯示堆中對象的統計信息
- permstat : to print permanent generation statistics
- F : 當-dump沒有響應時,強制生成dump快照
經常使用格式
-dump::live,format=b,file=<filename> pid
dump堆到文件,format指定輸出格式,live指明是活着的對象,file指定文件名
$ jmap -dump:live,format=b,file=dump.hprof 28920
Dumping heap to /home/xxx/dump.hprof ...
Heap dump file created
dump.hprof這個後綴是爲了後續能夠直接用MAT(Memory Anlysis Tool)打開。
打印等待回收對象的信息
$ jmap -finalizerinfo 28920
Attaching to process ID 28920, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
Number of objects pending for finalization: 0
能夠看到當前F-QUEUE隊列中並無等待Finalizer線程執行finalizer方法的對象。
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況,能夠用此來判斷內存目前的使用狀況以及垃圾回收狀況
$ jmap -heap 28920 Attaching to process ID 28920, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.71-b01 using thread-local object allocation. Parallel GC with 4 thread(s)//GC 方式 Heap Configuration: //堆內存初始化配置 MinHeapFreeRatio = 0 //對應jvm啓動參數-XX:MinHeapFreeRatio設置JVM堆最小空閒比率(default 40) MaxHeapFreeRatio = 100 //對應jvm啓動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閒比率(default 70) MaxHeapSize = 2082471936 (1986.0MB) //對應jvm啓動參數-XX:MaxHeapSize=設置JVM堆的最大大小 NewSize = 1310720 (1.25MB)//對應jvm啓動參數-XX:NewSize=設置JVM堆的‘新生代’的默認大小 MaxNewSize = 17592186044415 MB//對應jvm啓動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小 OldSize = 5439488 (5.1875MB)//對應jvm啓動參數-XX:OldSize=<value>:設置JVM堆的‘老生代’的大小 NewRatio = 2 //對應jvm啓動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率 SurvivorRatio = 8 //對應jvm啓動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值 PermSize = 21757952 (20.75MB) //對應jvm啓動參數-XX:PermSize=<value>:設置JVM堆的‘永生代’的初始大小 MaxPermSize = 85983232 (82.0MB)//對應jvm啓動參數-XX:MaxPermSize=<value>:設置JVM堆的‘永生代’的最大大小 G1HeapRegionSize = 0 (0.0MB) Heap Usage://堆內存使用狀況 PS Young Generation Eden Space://Eden區內存分佈 capacity = 33030144 (31.5MB)//Eden區總容量 used = 1524040 (1.4534378051757812MB) //Eden區已使用 free = 31506104 (30.04656219482422MB) //Eden區剩餘容量 4.614088270399305% used //Eden區使用比率 From Space: //其中一個Survivor區的內存分佈 capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used To Space: //另外一個Survivor區的內存分佈 capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used PS Old Generation //當前的Old區內存分佈 capacity = 86507520 (82.5MB) used = 0 (0.0MB) free = 86507520 (82.5MB) 0.0% used PS Perm Generation//當前的 「永生代」 內存分佈 capacity = 22020096 (