jmap簡介
jmap(JVM Memory Map)一方面可以擷取dump檔案(堆轉儲快照檔案,二進制檔案),它還可以擷取目标Java程序的記憶體相關資訊,包括Java堆各區域的使用情況、堆中對象的統計資訊、類加載資訊等。
選項 | 作用 |
---|---|
-dump | 生成dump檔案 |
-finalizerinfo | 以ClassLoader為統計口徑輸出永久代的記憶體狀态資訊 |
-heap | 輸出整個堆空間的詳細資訊,包括GC的使用、堆配置資訊,以及記憶體的使用資訊等 |
-histo | 輸出堆空間中對象的統計資訊,包括類、執行個體數量和合計容量 |
-permstat | 以ClassLoader為統計口徑輸出永久代的記憶體狀态資訊 |
-F | 當虛拟機程序對-dump選項沒有任何響應時,強制執行生成dump檔案 |
1)導出記憶體映像檔案
Heap dump又稱為堆轉儲檔案,指一個Java程序在某個時間點的記憶體快照。
注:通常在寫Heap dump檔案之前,會執行一次Full GC,是以heap dump中儲存的都是Full GC後留下的對象資訊。
手動導出
[[email protected] ~]# jmap -dump:format=b,file=/opt/1.hprof 12023
Dumping heap to /opt/1.hprof ...
Heap dump file created
[[email protected] ~]# jmap -dump:live,format=b,file=/opt/2.hprof 12023
Dumping heap to /opt/2.hprof ...
Heap dump file created
自動導出
JVM中配置以下參數,當發生OOM時,将導出應用程式的目前堆快照。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/3.hprof
2)顯示堆記憶體相關資訊
jmap -heap
[[email protected] ~]# jmap -heap 12023
Attaching to process ID 12023, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 90
MaxHeapSize = 8388608 (8.0MB)
NewSize = 2752512 (2.625MB)
MaxNewSize = 2752512 (2.625MB)
OldSize = 5636096 (5.375MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2490368 (2.375MB)
used = 0 (0.0MB)
free = 2490368 (2.375MB)
0.0% used
Eden Space:
capacity = 2228224 (2.125MB)
used = 0 (0.0MB)
free = 2228224 (2.125MB)
0.0% used
From Space:
capacity = 262144 (0.25MB)
used = 0 (0.0MB)
free = 262144 (0.25MB)
0.0% used
To Space:
capacity = 262144 (0.25MB)
used = 0 (0.0MB)
free = 262144 (0.25MB)
0.0% used
tenured generation:
capacity = 5636096 (5.375MB)
used = 283800 (0.27065277099609375MB)
free = 5352296 (5.104347229003906MB)
5.035400390625% used
749 interned Strings occupying 50616 bytes.
jmap -histo
由于jmap将通路堆中的所有對象,為了保證在此過程中不被應用線程幹擾,jmap需要借助安全點機制,讓所有線程停留在不改變堆中資料的狀态。也就是說,由jmap導出的堆快照必定是安全點位置的。這可能導緻基于該對快照的分析結果存在偏差。
例如:假設在編譯生成的機器碼中,某些堆對象的生命周期在兩個安全點之間,那麼:live選項将無法探知到這些對象。
另外,如果某個線程長時間無法跑到安全點,jmap将一直等下去。與jstat不同的是,垃圾回收器會主動将jstat所需要的摘要資料儲存至固定位置之中,而jstat隻需直接讀取即可。