【jmap】jmap命令详情

发布时间 2023-05-06 21:11:00作者: aaacarrot

简介

1、jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息。
2、如果给定的进程运行在64位虚拟机上,则必须指定 -J-d64选项,例如jmap -J-d64 -heap pid。
3、jmap可能在未来的JDK版本中删除。
可用于内存溢出,泄露等情况的内存分析


使用语法

<no option>

当不使用选项时,jmap打印共享对象映射。
对于加载到目标JVM中的每个共享对象,将打印其开始地址、映射大小和共享对象文件的完整路径。

-dump:[live,]format=b,file=

将Java堆以hprof二进制格式转储到filename文件中。

live是可选参数,如果指定,则只转储堆中的活动对象。

可以使用jhat (Java Heap Analysis Tool)工具来读取分析生产dump文件。

-heap

打印堆摘要 (可以看到新生代,老年代的内存占比等)

Attaching to process ID 327, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 357564416 (341.0MB)
   MaxNewSize               = 715653120 (682.5MB)
   OldSize                  = 716177408 (683.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 = 499646464 (476.5MB)
   used     = 49856184 (47.54656219482422MB)
   free     = 449790280 (428.9534378051758MB)
   9.978292171001934% used
From Space:
   capacity = 15204352 (14.5MB)
   used     = 0 (0.0MB)
   free     = 15204352 (14.5MB)
   0.0% used
To Space:
   capacity = 15204352 (14.5MB)
   used     = 0 (0.0MB)
   free     = 15204352 (14.5MB)
   0.0% used
PS Old Generation
   capacity = 1431830528 (1365.5MB)
   used     = 56643848 (54.01978302001953MB)
   free     = 1375186680 (1311.4802169799805MB)
   3.956044161114576% used

-histo[:live]
e.g. jmap -histo:live pid | head -20

打印堆的直方图。

对于每个Java类,将打印对象数量、内存大小(以字节为单位)和完全限定类名。

VM内部类名以''前缀打印,即打印出来的类名前带的是VM的内部类。

如果指定了live子选项,则只统计活动对象。

 num     #instances         #bytes  class name
----------------------------------------------
   1:        121998       15572640  [C
   2:          5456        4763856  [B
   3:         37391        3290408  java.lang.reflect.Method
   4:        102825        3290400  java.util.concurrent.ConcurrentHashMap$Node
   5:         25700        3203200  [Ljava.lang.Object;
   6:        120358        2888592  java.lang.String
   7:         16370        1820704  java.lang.Class

jmap -dump:live,format=b,file=/xxx/xx/x/dump.log

导出堆转储文件,可用于离线分析(但如果内存太大,可能会整个线程挂起,卡住动不了了)




参考:
https://zhuanlan.zhihu.com/p/475571429