首页 > 编程知识 正文

jmap -heap详解,jmap 导出dump

时间:2023-05-03 18:04:20 阅读:257603 作者:3815

jmap(JVM Memory Map)命令用于生成heap dump文件如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等命令格式 jmap [option] LVMID option参数

dump : 生成堆转储快照

finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象

heap : 显示Java堆详细信息

histo : 显示堆中对象的统计信息

permstat : to print permanent generation statistics

F : 当-dump没有响应时,强制生成dump快照

示例

-dump

常用格式

-dump::live,format=b,file=<filename> pid

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

$ jmap -dump:live,format=b,file=dump.hprof 28920

Dumping heap to /home/xxx/dump.hprof ...

Heap dump file created

dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。

-finalizerinfo

打印等待回收对象的信息

$ jmap -finalizerinfo 28920

 Attaching to process ID 28920, please wait...

 Debugger attached successfully.

 Server compiler detected.

 JVM version is 24.71-b01

 Number of objects pending for finalization: 0

可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

-heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况

$ jmap -heap 28920

 Attaching to process ID 28920, please wait...

 Debugger attached successfully.

 Server compiler detected.

 JVM version is 24.71-b01  

 

 using thread-local object allocation.

 Parallel GC with 4 thread(s)//GC 方式  

 

 Heap Configuration: //堆内存初始化配置

    MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)

    MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)

    MaxHeapSize      = 2082471936 (1986.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小

    NewSize          = 1310720 (1.25MB)//对应jvm启动参数-XX:NewSize=设置JVM堆的‘欢喜的流沙代’的默认大小

    MaxNewSize       = 17592186044415 MB//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘欢喜的流沙代’的最大大小

    OldSize          = 5439488 (5.1875MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小

    NewRatio         = 2 //对应jvm启动参数-XX:NewRatio=:‘欢喜的流沙代’和‘老生代’的大小比率

    SurvivorRatio    = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值

    PermSize         = 21757952 (20.75MB)  //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小

    MaxPermSize      = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小

    G1HeapRegionSize = 0 (0.0MB)  

 

 Heap Usage://堆内存使用情况

 PS Young Generation

 Eden Space://Eden区内存分布

    capacity = 33030144 (31.5MB)//Eden区总容量

    used     = 1524040 (1.4534378051757812MB)  //Eden区已使用

    free     = 31506104 (30.04656219482422MB)  //Eden区剩余容量

    4.614088270399305% used //Eden区使用比率

 From Space:  //其中一个Survivor区的内存分布

    capacity = 5242880 (5.0MB)

    used     = 0 (0.0MB)

    free     = 5242880 (5.0MB)

    0.0% used

 To Space:  //另一个Survivor区的内存分布

    capacity = 5242880 (5.0MB)

    used     = 0 (0.0MB)

    free     = 5242880 (5.0MB)

    0.0% used

 PS Old Generation //当前的Old区内存分布

    capacity = 86507520 (82.5MB)

    used     = 0 (0.0MB)

    free     = 86507520 (82.5MB)

    0.0% used

 PS Perm Generation//当前的 “永生代” 内存分布

    capacity = 22020096 (21.0MB)

    used     = 2496528 (2.3808746337890625MB)

    free     = 19523568 (18.619125366210938MB)

    11.337498256138392% used  

 

 670 interned Strings occupying 43720 bytes.

可以很清楚的看到Java堆中各个区域目前的情况。

-histo

打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )

$ jmap -histo:live 28920 | more

num     #instances         #bytes  class name

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

  1:         83613       12012248  <constMethodKlass>

  2:         23868       11450280  [B

  3:         83613       10716064  <methodKlass>

  4:         76287       10412128  [C

  5:          8227        9021176  <constantPoolKlass>

  6:          8227        5830256  <instanceKlassKlass>

  7:          7031        5156480  <constantPoolCacheKlass>

  8:         73627        1767048  java.lang.String

  9:          2260        1348848  <methodDataKlass>

 10:          8856         849296  java.lang.Class

 ....

仅仅打印了前10行

xml class name是对象类型,说明如下:

B  byteC  charD  doubleF  floatI  intJ  longZ  boolean[  数组,如[I表示int[][L+类名 其他对象

-permstat

打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

$ jmap -permstat 28920

 Attaching to process ID 28920, please wait...

 Debugger attached successfully.

 Server compiler detected.

 JVM version is 24.71-b01

 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>             3111    18154296          null          live    <internal>

 0x0000000600905cf8      1       1888    0x0000000600087f08      dead   sun/reflect/DelegatingClassLoader@0x00000007800500a0

 0x00000006008fcb48      1       1888    0x0000000600087f08      dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0

 0x00000006016db798      0       0       0x00000006008d3fc0      dead    java/util/ResourceBundle$RBClassLoader@0x0000000780626ec0

 0x00000006008d6810      1       3056      null          dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0

-F

强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。