jmap的使用以及內存溢出分析


前面通過jstat可以對JVM對的內存進行統計分析,而jmap可以獲取到更加詳細的內容,如:內存使用情況的匯總,對內存溢出的定位與分析。

查看內存使用情況

使用命令【jmap -heap 進程號】

Attaching to process ID 17656, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.73-b02

using thread-local object allocation.
Mark Sweep Compact GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 268435456 (256.0MB)
   NewSize                  = 5570560 (5.3125MB)
   MaxNewSize               = 89456640 (85.3125MB)
   OldSize                  = 11206656 (10.6875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 12582912 (12.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 4294901760 (4095.9375MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 8847360 (8.4375MB)
   used     = 3589544 (3.4232559204101562MB)
   free     = 5257816 (5.014244079589844MB)
   40.571922019675924% used
Eden Space:
   capacity = 7929856 (7.5625MB)
   used     = 2672040 (2.5482559204101562MB)
   free     = 5257816 (5.014244079589844MB)
   33.69594605501033% used
From Space:
   capacity = 917504 (0.875MB)
   used     = 917504 (0.875MB)
   free     = 0 (0.0MB)
   100.0% used
To Space:
   capacity = 917504 (0.875MB)
   used     = 0 (0.0MB)
   free     = 917504 (0.875MB)
   0.0% used
tenured generation:
   capacity = 19415040 (18.515625MB)
   used     = 12128424 (11.566566467285156MB)
   free     = 7286616 (6.949058532714844MB)
   62.46921973892405% used

12283 interned Strings occupying 1576968 bytes.

查看內存中對象數量及大小

 使用命令【jmap -histo:live 進程號 | more】查看活躍對象

 使用命令【jmap -histo 進程號 | more】查看所有對象

 num     #instances         #bytes  class name
----------------------------------------------
   1:         29051        5802816  [C
   2:          3618        1045824  [I
   3:         27608         441728  java.lang.String
   4:           779         386792  [B
   5:          3229         316624  java.lang.Class
   6:          3394         298672  java.lang.reflect.Method
   7:          9984         239616  java.util.HashMap$Node
   8:          3370         201096  [Ljava.lang.Object;
   9:           757         119992  [Ljava.util.HashMap$Node;
  10:          3047          73128  java.util.concurrent.ConcurrentHashMap$Node
  11:           820          66880  [Ljava.lang.String;
  12:          1057          42280  java.util.HashMap
  13:           568          40896  java.lang.reflect.Constructor
  14:          2207          38952  [Ljava.lang.Class;
  15:          1572          37728  java.util.Hashtable$Entry
  16:          1109          35488  java.util.LinkedHashMap$Entry
  17:          1084          34688  java.util.TreeMap$Entry
  18:           855          34200  org.apache.tomcat.util.modeler.AttributeInfo
  19:           133          33672  [[C
  20:           859          27488  java.lang.ref.SoftReference
  21:            47          23568  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  22:          2529          20232  java.lang.Object
  23:           594          19008  javax.management.MBeanAttributeInfo
  24:           108          17608  [Ljava.util.Hashtable$Entry;
  25:           710          17040  java.util.ArrayList
  26:           565          13560  com.sun.org.apache.xerces.internal.xni.QName

查看內存中對象數量及大小  

   #查看所有對象,包括活躍以及非活躍的  jmap ‐histo <pid> | more
  #查看活躍對象  jmap ‐histo:live <pid> | more

#查看活躍對象
jmap -histo:live 29720 | more

對象說明:
    B byte
    C char
    D double
    F float
    I int
    J long
    Z boolean
    [ 數組,如[I表示int[]
    [L+類名 其他對象

將內存使用情況dump到文件中

  有些時候我們需要將jvm當前內存中的情況dump到文件中,然后對它進行分析,jmap也是支持dump到文件中的。

#用法: jmap -dump:format=b,file=dumpFileName <pid>
jmap -dump:format=b,file=../tmp/dump.dat 29720
 

通過jhat對dump文件進行分析

 
  我們將jvm的內存dump到文件中,這個文件是一個二進制的文件,不方便查看,這時我們可以借助於jhat工具進行查看。
#用法: jhat -port <port> <file>
jhat -port 29729 ../tmp/dump.dat

打開瀏覽器訪問http://localhost:8999/

 在最后面有OQL查詢功能:

 

 點擊下面選項

進入頁面,輸入下面語句查詢字符串大於10000,點擊Execute按鈕,查詢結果:

select s from java.lang.String s where s.value.length >= 10000

進入如下頁面

通過MAT工具對dump文件進行分析

MAI工具介紹

MAT(Memory Analyzer Tool),一個基於Eclipse的內存分析工具,是一個快速、功能豐富的JAVA heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。使用內存分析工具從眾多的對象中進行分析,快速的計算出在內存中對象的占用大小,看看是誰阻止了垃圾收集器的回收工作,並可以通過報表直觀的查看到可能造成這種結果的對象。

下載安裝

下載地址:https://www.eclipse.org/mat/downloads.php

 

 解壓后得到的文件

使用

雙擊啟動 MemoryAnalyzer.exe應用程序

 

 

Actions說明:

  Histogram:列出內存中的對象,對象的個數以及大小

  Dominator Tree:列出最大的對象以及其依賴存活的對象

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM