A09 - 003、jmap的使用以及内存溢出分析

0、本章学习目录大纲 - jmap的使用

初学耗时:1h

注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

一、jstat与jmap的区别

二、查看内存使用情况

三、查看内存中对象数量及大小

四、将内存使用情况dump到文件中

五、通过jhat对dump文件进行分析

六、通过MAT工具对dump文件进行分析
    6.1  MAT工具介绍。
    6.2  下载安装。
    6.3  使用。




ギ 舒适区ゾ || ♂ 累觉无爱 ♀





一、jstat与jmap的区别

前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容。

如:内存使用情况的汇总、对内存溢出的定位与分析。



旱鸭子:好想游泳啊!

- - - - - - - - - - - - - - - - - - - - - - - - - - - -


二、查看内存使用情况

jmap -heap <进程id>
Attaching to process ID 6219, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.141-b15

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration: #堆内存配置信息
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 488636416 (466.0MB)
   NewSize                  = 10485760 (10.0MB)
   MaxNewSize               = 162529280 (155.0MB)
   OldSize                  = 20971520 (20.0MB)
   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 = 123731968 (118.0MB)
   used     = 1384736 (1.320587158203125MB)
   free     = 122347232 (116.67941284179688MB)
   1.1191416594941737% used
From Space:
   capacity = 9437184 (9.0MB)
   used     = 0 (0.0MB)
   free     = 9437184 (9.0MB)
   0.0% used
To Space:
   capacity = 9437184 (9.0MB)
   used     = 0 (0.0MB)
   free     = 9437184 (9.0MB)
   0.0% used
PS Old Generation #年老代
   capacity = 28311552 (27.0MB)
   used     = 13698672 (13.064071655273438MB)
   free     = 14612880 (13.935928344726562MB)
   48.38545057508681% used

13648 interned Strings occupying 1866368 bytes.

旱鸭子:好想游泳啊!

- - - - - - - - - - - - - - - - - - - - - - - - - - - -




三、查看内存中对象数量及大小

#查看所有对象,包括活跃以及非活跃的
jmap -histo <pid> | more

#查看活跃对象
jmap -histo:live <pid> | more
 num     #instances         #bytes  class name
----------------------------------------------
   1:         37437        7914608  [C
   2:         34916         837984  java.lang.String
   3:           884         654848  [B
   4:         17188         550016  java.util.HashMap$Node
   5:          3674         424968  java.lang.Class
   6:          6322         395512  [Ljava.lang.Object;
   7:          3738         328944  java.lang.reflect.Method
   8:          1028         208048  [Ljava.util.HashMap$Node;
   9:          2247         144264  [I
  10:          4305         137760  java.util.concurrent.ConcurrentHashMap$Node
  11:          1270         109080  [Ljava.lang.String;
  12:            64          84128  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  13:          1714          82272  java.util.HashMap
  14:          3285          70072  [Ljava.lang.Class;
  15:          2888          69312  java.util.ArrayList
  16:          3983          63728  java.lang.Object
  17:          1271          61008  org.apache.tomcat.util.digester.CallMethodRule
  18:          1518          60720  java.util.LinkedHashMap$Entry
  19:          1671          53472  com.sun.org.apache.xerces.internal.xni.QName
  20:            88          50880  [Ljava.util.WeakHashMap$Entry;
  21:           618          49440  java.lang.reflect.Constructor
  22:          1545          49440  java.util.Hashtable$Entry
  23:          1027          41080  java.util.TreeMap$Entry
  24:           846          40608  org.apache.tomcat.util.modeler.AttributeInfo
  25:           142          38032  [S
  26:           946          37840  java.lang.ref.SoftReference
  27:           226          36816  [[C
  。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  
#对象说明
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 6219

旱鸭子:好想游泳啊!

- - - - - - - - - - - - - - - - - - - - - - - - - - - -




五、通过jhat对dump文件进行分析

  5.1 ~ 借助jhat查看dump.dat。

在上一小节中,我们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看。

#用法:
jhat -port <port> <file>

#示例:
jhat -port 9999 /tmp/dump.dat

  5.2 ~ 打开浏览器访问。

http://192.168.1.101:9999/

A09 - 003、jmap的使用以及内存溢出分析

  5.3 ~ 在最后面有OQL查询功能。

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

A09 - 003、jmap的使用以及内存溢出分析

  5.4 ~ 查询结果。

A09 - 003、jmap的使用以及内存溢出分析


旱鸭子:好想游泳啊!

- - - - - - - - - - - - - - - - - - - - - - - - - - - -




六、通过MAT工具对dump文件进行分析

  6.1 ~ MAT工具介绍。

官网地址:https://www.eclipse.org/mat/
A09 - 003、jmap的使用以及内存溢出分析

  6.2 ~ 下载安装。

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

A09 - 003、jmap的使用以及内存溢出分析

  6.3 ~ 使用。

    6.2.1 .  解压后启动。

    A09 - 003、jmap的使用以及内存溢出分析

    6.2.2 .  打开dump文件。

    A09 - 003、jmap的使用以及内存溢出分析

    6.2.3 .  如下操作。

    A09 - 003、jmap的使用以及内存溢出分析

    6.2.4 .  Overview。

    A09 - 003、jmap的使用以及内存溢出分析

    6.2.5 .  Histogram。

    A09 - 003、jmap的使用以及内存溢出分析

    6.2.6 .  查看对象以及它的依赖。

    A09 - 003、jmap的使用以及内存溢出分析

    6.2.7 .  查看可能存在内存泄露的分析。

    A09 - 003、jmap的使用以及内存溢出分析



旱鸭子:好想游泳啊!

- - - - - - - - - - - - - - - - - - - - - - - - - - - -



^ 至此,jmap的使用以及内存溢出分析完成。


- - - - - - - - - - - - - - - - - - - - - - - - - - - -


※ 世间诱惑何其多,坚定始终不动摇。

北国风光,千里冰封,万里雪飘。
望长城内外,惟余莽莽;大河上下,顿失滔滔。
山舞银蛇,原驰蜡象,欲与天公试比高。
须晴日,看红装素裹,分外妖娆。
*如此多娇,引无数英雄竞折腰。
惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
一代天骄,成吉思汗,只识弯弓射大雕。
俱往矣,数风流人物,还看今朝。
A09 - 003、jmap的使用以及内存溢出分析



旱鸭子:好想游泳啊!

- - - - - - - - - - - - - - - - - - - - - - - - - - - -


注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

我知道我的不足,我也知道你的挑剔,但我就是我,不一样的烟火,谢谢你的指指点点,造就了我的点点滴滴:)!



旱鸭子:好想游泳啊!


上一篇:jvm性能调优实战 - 30使用jmap和jhat摸清线上系统的对象分布


下一篇:将java进程转移到“解剖台”之前,法医都干了什么?