天天看點

JVM指令行監控工具之jmap(JVM Memory Map)

jmap簡介

jmap(JVM Memory Map)一方面可以擷取dump檔案(堆轉儲快照檔案,二進制檔案),它還可以擷取目标Java程序的記憶體相關資訊,包括Java堆各區域的使用情況、堆中對象的統計資訊、類加載資訊等。

JVM指令行監控工具之jmap(JVM Memory Map)
選項 作用
-dump 生成dump檔案
-finalizerinfo 以ClassLoader為統計口徑輸出永久代的記憶體狀态資訊
-heap 輸出整個堆空間的詳細資訊,包括GC的使用、堆配置資訊,以及記憶體的使用資訊等
-histo 輸出堆空間中對象的統計資訊,包括類、執行個體數量和合計容量
-permstat 以ClassLoader為統計口徑輸出永久代的記憶體狀态資訊
-F 當虛拟機程序對-dump選項沒有任何響應時,強制執行生成dump檔案

1)導出記憶體映像檔案

Heap dump又稱為堆轉儲檔案,指一個Java程序在某個時間點的記憶體快照。

注:通常在寫Heap dump檔案之前,會執行一次Full GC,是以heap dump中儲存的都是Full GC後留下的對象資訊。

手動導出

JVM指令行監控工具之jmap(JVM Memory Map)
[[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

JVM指令行監控工具之jmap(JVM Memory Map)

由于jmap将通路堆中的所有對象,為了保證在此過程中不被應用線程幹擾,jmap需要借助安全點機制,讓所有線程停留在不改變堆中資料的狀态。也就是說,由jmap導出的堆快照必定是安全點位置的。這可能導緻基于該對快照的分析結果存在偏差。

例如:假設在編譯生成的機器碼中,某些堆對象的生命周期在兩個安全點之間,那麼:live選項将無法探知到這些對象。

另外,如果某個線程長時間無法跑到安全點,jmap将一直等下去。與jstat不同的是,垃圾回收器會主動将jstat所需要的摘要資料儲存至固定位置之中,而jstat隻需直接讀取即可。

3)檢視系統的ClassLoader資訊

JVM指令行監控工具之jmap(JVM Memory Map)

4)檢視堆積在finalizer隊列中的對象

JVM指令行監控工具之jmap(JVM Memory Map)