JMap
首先要知道Java進程的pid。
Windows:
..
..
..
Linux:
ps -ef | grep java
查看堆棧信息(jmap -heap pid)
jmap -heap 8512 Attaching to process ID 8512, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.161-b12 using thread-local object allocation. Parallel GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 2128609280 (2030.0MB) NewSize = 44564480 (42.5MB) MaxNewSize = 709361664 (676.5MB) OldSize = 89653248 (85.5MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 68157440 (65.0MB) used = 57053032 (54.410011291503906MB) free = 11104408 (10.589988708496094MB) 83.70770967923679% used From Space: capacity = 5242880 (5.0MB) used = 3113008 (2.9687957763671875MB) free = 2129872 (2.0312042236328125MB) 59.37591552734375% used To Space: capacity = 3670016 (3.5MB) used = 0 (0.0MB) free = 3670016 (3.5MB) 0.0% used PS Old Generation capacity = 89653248 (85.5MB) used = 49152 (0.046875MB) free = 89604096 (85.453125MB) 0.05482456140350877% used 3998 interned Strings occupying 342784 bytes.
打印等待回收的對象信息(jmap -finalizerinfo pid)
jmap -finalizerinfo 8512 Attaching to process ID 8512, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.161-b12 Number of objects pending for finalization: 0
打印堆裏面對象的統計信息:對象數量、佔用大小、類名(jmap -histo:live pid | more)
jmap -histo:live 8512 | more num #instances #bytes class name ---------------------------------------------- 1: 9728 1016408 [C 2: 1650 303784 [B 3: 9441 226584 java.lang.String 4: 1821 205672 java.lang.Class 5: 1285 92520 org.apache.zookeeper.data.StatPersisted 6: 1735 87008 [Ljava.lang.Object; 7: 2385 76320 java.util.HashMap$Node 8: 2322 74304 java.util.concurrent.ConcurrentHashMap$Node 9: 1199 57552 java.util.HashMap 10: 783 54312 [I 11: 658 45208 [Ljava.util.HashMap$Node; 12: 1285 41120 org.apache.zookeeper.server.DataNode 13: 437 38456 java.lang.reflect.Method 14: 502 36144 org.apache.zookeeper.server.Request 15: 882 35280 java.util.TreeMap$Entry 16: 501 24048 org.apache.zookeeper.txn.TxnHeader 17: 889 21336 java.util.LinkedList$Node 18: 582 21296 [Ljava.lang.String; 19: 1049 16784 java.util.HashSet 20: 501 16032 org.apache.zookeeper.server.quorum.QuorumPacket 21: 399 15960 java.lang.ref.SoftReference 22: 31 15952 [Ljava.util.concurrent.ConcurrentHashMap$Node;
打印類加載器統計信息(jmap -clstats pid)
jmap -clstats 8512 Attaching to process ID 8512, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.161-b12 finding class loader instances ..done. computing per loader stat ..done. please wait.. computing liveness....................................liveness analysis may be inaccurate ... class_loader classes bytes parent_loader alive? type <bootstrap> 1359 2420845 null live <internal> 0x000000008128cef8 1 1474 null dead sun/reflect/DelegatingClassLoader@0x0000000017289df8 0x000000008128d088 1 880 null dead sun/reflect/DelegatingClassLoader@0x0000000017289df8 0x000000008128d218 1 880 null dead sun/reflect/DelegatingClassLoader@0x0000000017289df8 0x00000000814621d0 0 0 0x000000008120b6c8 dead java/util/ResourceBundle$RBClassLoader@0x0000000017303798 0x000000008120b6c8 358 716069 0x000000008120b728 live sun/misc/Launcher$AppClassLoader@0x000000001728f6a0 0x000000008120b728 3 2574 null live sun/misc/Launcher$ExtClassLoader@0x000000001728fa48 0x000000008128cfc0 1 880 null dead sun/reflect/DelegatingClassLoader@0x0000000017289df8 0x000000008128d150 1 880 null dead sun/reflect/DelegatingClassLoader@0x0000000017289df8 total = 9 1725 3144482 N/A alive=3, dead=6 N/A
把堆信息生成一個文件(jmap -dump:live,format=b,file=heap.bin <pid>)
[d:\]$ jmap -dump:live,format=b,file=heap.bin 8512 Dumping heap to D:\heap.bin ... Heap dump file created
之後,我們利用Mat來分析,下載 Eclipse Memory Analyzer
..
下載完解壓
...
..
..
..打開我們剛纔生成的文件
..
..看效果
..
JStat
每隔一段時間輸出GC情況(jstat -gcutil pid inteval)
[d:\]$ jstat -gcutil 8512 3000 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082 0.00 0.00 0.94 7.26 96.88 93.14 7 0.061 2 0.022 0.082
參數:
S0 from區已使用容量的百分比
S1 to區已使用容量的百分比
E 伊甸區已使用容量的百分比
O 老年代已使用容量的百分比
M 元數據空間利用率
CCS 壓縮類空間利用率
YGC 從應用程序啓動到採樣時年輕代中gc次數
YGCT 從應用程序啓動到採樣時年輕代中gc所用時間(s)
FGC 從應用程序啓動到採樣時old代(全gc)gc次數
FGCT 從應用程序啓動到採樣時old代(全gc)gc所用時間(s)
GCT 從應用程序啓動到採樣時gc用的總時間(s)
還有另外一個方法,輸出的要全面一些
[d:\]$ jstat -gc 8512 3000 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 4096.0 3584.0 0.0 0.0 133120.0 1257.0 37376.0 2715.3 9600.0 9300.8 1152.0 1073.0 7 0.061 2 0.022 0.082 4096.0 3584.0 0.0 0.0 133120.0 1257.0 37376.0 2715.3 9600.0 9300.8 1152.0 1073.0 7 0.061 2 0.022 0.082 4096.0 3584.0 0.0 0.0 133120.0 1257.0 37376.0 2715.3 9600.0 9300.8 1152.0 1073.0 7 0.061 2 0.022 0.082 4096.0 3584.0 0.0 0.0 133120.0 1257.0 37376.0 2715.3 9600.0 9300.8 1152.0 1073.0 7 0.061 2 0.022 0.082
參數:
S0C: 當前from區容量
S1C: 當前to區容量
S0U: from區已使用的容量
S1U: to區已使用的容量
EC: 當前伊甸區的容量
EU: 伊甸區已使用的容量
OC: 老年代的容量
OU: 老年代已使用的容量
MC: 元空間容量
MU: 元空間已使用容量
CCSC: 壓縮類空間容量
CCSU: 已使用的壓縮類空間
YGC: 年輕代gc次數
YGCT: 年輕代gc時間
FGC: full gc 次數
FGCT: Full gc時間
GCT: 總gc時間
參考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstat.html