loong - Java 命令 - jmap

loong - Java 命令 - jmap

jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。

基本语法

jmap [options] pid

参数说明

  • option:jmap命令的可选参数。如果没有指定这个参数,命令会显示Java虚拟机进程的内存映像信息

常用选项

  • :显示Java虚拟机进程的内存映像信息

  • -heap:打印堆信息

    • 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
    • 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
    • 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。
  • -histo[:live]:显示Java堆中对象的统计信息,包括:对象数量、占用内存大小(单位:字节)和类的完全限定名

  • -clstats:显示Java堆中元空间的类加载器的统计信息

    • class_loader:当Java虚拟机运行时,类加载器对象的地址
    • classes:已加载类的数量
    • bytes:该类加载器加载的所有类的元数据所占的字节数
    • parent_loader:父类加载器对象的地址,如果没有显示null。
    • alive:是否存活的标识,表示类加载器对象是否将被垃圾回收。
    • type:该类加载器的类名。
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象

  • -dump::生成Java虚拟机的堆转储快照dump文件

    • live参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。
    • format=b表示以hprof二进制格式转储Java堆的内存。
    • file=<filename>用于指定快照dump文件的文件名。
  • -F:强制模式。如果指定的pid没有响应,可以配合-dump-histo一起使用。此模式下,不支持live参数

  • -J:传递参数给jmap启动的jvm

命令演示

jmap -heap [pid]

  • 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
  • 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
  • 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。
C:\WINDOWS\system32>jmap -heap 18072
Attaching to process ID 18072, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.391-b13

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 12819890176 (12226.0MB)
   NewSize                  = 267386880 (255.0MB)
   MaxNewSize               = 4272947200 (4075.0MB)
   OldSize                  = 535822336 (511.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 = 252182528 (240.5MB)
   used     = 221704848 (211.43421936035156MB)
   free     = 30477680 (29.065780639648438MB)
   87.9144363244705% used
From Space:
   capacity = 11534336 (11.0MB)
   used     = 0 (0.0MB)
   free     = 11534336 (11.0MB)
   0.0% used
To Space:
   capacity = 33030144 (31.5MB)
   used     = 0 (0.0MB)
   free     = 33030144 (31.5MB)
   0.0% used
PS Old Generation
   capacity = 800063488 (763.0MB)
   used     = 60388944 (57.59138488769531MB)
   free     = 739674544 (705.4086151123047MB)
   7.548018989213016% used

21427 interned Strings occupying 2023952 bytes.

jmap -histo[:live]

# 方式一 输出所有对象
jmap -histo pid

# 方式二 输出所有活动对象 (:live 会先出发gc)
jmap -histo:live pid

# 方式三 输出前10个数据
jmap -histo pid | head -n 11

# 方式四 输出到指定文件
jmap -histo pid >a.log

# 方式五 输出大对象
jmap -histo pid | more

# 方式六 输出少对象
jmap -histo pid | less
# 输出所有对象(太多了做了截取)
C:\WINDOWS\system32>jmap -histo 18072

 num     #instances         #bytes  class name
----------------------------------------------
   1:        240247       78724144  [B
   2:        470342       54201160  [C
   3:         64696       45506688  [I
   4:        262144       27262976  org.apache.logging.log4j.core.async.RingBufferLogEvent
   5:        262139        8388448  org.apache.logging.log4j.util.SortedArrayStringMap
   6:        262144        6291456  org.apache.logging.log4j.core.time.MutableInstant
   7:        257706        6184944  java.lang.String
   8:        230034        4709848  [Ljava.lang.Class;
   9:         61032        4409824  [Ljava.lang.Object;
  10:        113236        3623552  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
  11:         27915        2456520  java.lang.reflect.Method
  12:         71090        2274880  java.util.ArrayList$Itr
  13:         27894        1562064  jdk.internal.org.objectweb.asm.Item
  14:         30938        1485024  java.util.HashMap
  15:         16933        1370072  [Ljava.util.HashMap$Node;
  16:         15286        1192240  [S
  17:         10672        1173000  java.lang.Class
  18:         20725        1160600  java.util.LinkedHashMap
  19:         34741        1111712  java.util.HashMap$Node
  20:         33686        1077952  java.util.concurrent.ConcurrentHashMap$Node
  21:         41386         993264  java.lang.StringBuilder

# 只计算活动的对象(会触发gc)
C:\WINDOWS\system32>jmap -histo:live 18072
# 与上面一样的效果

jmap -clstats [pid]

  • class_loader:当Java虚拟机运行时,类加载器对象的地址
  • classes:已加载类的数量
  • bytes:该类加载器加载的所有类的元数据所占的字节数
  • parent_loader:父类加载器对象的地址,如果没有显示null。
  • alive:是否存活的标识,表示类加载器对象是否将被垃圾回收。
  • type:该类加载器的类名。
C:\Users\niesh>jmap -clstats 15968
Attaching to process ID 15968, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.333-b02
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>     2710    4828467   null          live    <internal>
0x00000006c6e8bce8      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8c5e8      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6812080      1       1472    0x00000006c5b93dc0      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c70a5308      1       880       null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c5f3f2f0      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6068d00      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8ade0      1       880     0x00000006c5b93dc0      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8dae0      1       1471    0x00000006c5b93dc0      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c5f3d5f8      1       1481      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c5f3f9f8      1       1471      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8a9f8      1       880     0x00000006c5b93dc0      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0

jmap -finalizerinfo [pid]

C:\Users\niesh>jmap -finalizerinfo 15968
Attaching to process ID 15968, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.333-b02
Number of objects pending for finalization: 0

jmap -dump [dump-options] [pid]

  • live参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。
  • format=b表示以hprof二进制格式转储Java堆的内存。
  • file=<filename>用于指定快照dump文件的文件名。
jmap  -dump:format=b,file=/path/heap.bin 15968
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7-Moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值