JDK 常用工具 —— jmap 详解

jmap 是 JDK 自带的一个命令行工具,可以用于生成 Java Heap Dump 文件,以及查看 Java 进程中的内存使用情况。

本文内容来自一篇整理得非常详细的文档: https://juejin.cn/post/6844904062526160904

语法

jmap [option]  <pid>
jmap [option] <executable  (to connect to a core file)
jmap [option] [server_id@] (to connect to remote debug server)

option:命令选项,常用选项如下:

  • -heap:打印 Java 堆概要信息,包括使用的 GC 算法、堆配置参数和各代中堆内存使用情况;
  • -histo[:live]: 打印 Java 堆中对象直方图,通过该图可以获取每个 class 的对象数目,占用内存大小和类全名信息,带上 :live,则只统计活着的对象;
  • -permstat 打印永久代统计信息;
  • -finalizerinfo 打印等待回收的对象信息
  • -dump: 以 hprof 二进制格式将 Java 堆信息输出到文件内,该文件可以用 JProfiler、VisualVM 或 jhat 等工具查看;

dump-options 选项:

  • live 只输出活着的对象,不指定则输出堆中所有对象
  • format=b 指定输出格式为二进制
  • file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin
  • -F 与-dump: 或 -histo 一起使用,当没有响应时,强制执行;注意:不支持live子选项
  • pid:进程id

示例

jmap -heap pid

> jmap -heap 10352

jmap -heap 10352
Attaching to process ID 10352, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09

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

Heap Configuration:
   //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(defalut 40)
   MinHeapFreeRatio         = 0 
   //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapFreeRatio         = 100
   //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   MaxHeapSize              = 4280287232 (4082.0MB)
   //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   NewSize                  = 89128960 (85.0MB)
   //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   MaxNewSize               = 1426587648 (1360.5MB)
   //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老年代’的大小
   OldSize                  = 179306496 (171.0MB)
   //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   NewRatio                 = 2
   //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   SurvivorRatio            = 8
   //对应jvm启动参数-XX:MetaspaceSize=<value>:设置JVM堆的‘元空间’的初始大小
   // jdk1.8 永久代已经被元空间所取代
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   //对应jvm启动参数-XX:MaxMetaspaceSize= :设置JVM堆的‘元空间’的最大大小
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
//堆内存分布
Heap Usage:
//新生代的内存分布
PS Young Generation
//Eden区内存分布
Eden Space:
   //Eden区总容量
   capacity = 1425539072 (1359.5MB)
   //Eden区已使用
   used     = 28510792 (27.19001007080078MB)
   //Eden区剩余容量
   free     = 1397028280 (1332.3099899291992MB)
   //Eden区使用比率
   2.0000007407724003% used
From Space:
   capacity = 524288 (0.5MB)
   used     = 65536 (0.0625MB)
   free     = 458752 (0.4375MB)
   12.5% used
To Space:
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation
   capacity = 128974848 (123.0MB)
   used     = 24006808 (22.894676208496094MB)
   free     = 104968040 (100.1053237915039MB)
   18.613557893086256% used

13410 interned Strings occupying 1194568 bytes.

jmap -histo pid

>jmap -histo 10352

 num     #instances         #bytes  class name
----------------------------------------------
   1:      27073797      433180752  java.lang.Integer
   2:          5442       16503144  [I
   3:          5005        6143944  [B
   4:         33835        3446608  [C
   5:          9721         855448  java.lang.reflect.Method
   6:         33751         810024  java.lang.String
   7:          6494         717416  java.lang.Class
   8:         14303         457696  java.util.concurrent.ConcurrentHashMap$Node
   ...

jmap -histo:live pid

统计 heap 中所有生存的对象的情况, 这个命令会先触发 gc 再统计:

> jmap -histo:live 10352

 num     #instances         #bytes  class name
----------------------------------------------
   1:         27483        2670608  [C
   2:          6453         713152  java.lang.Class
   3:         27300         655200  java.lang.String
   4:         12861         411552  java.util.concurrent.ConcurrentHashMap$Node
   5:          6364         327688  [Ljava.lang.Object;
   6:          2496         219648  java.lang.reflect.Method
   7:           874         178440  [B
   ...

jmap -dump:live,format=b,file=a.log pid

执行这个命令,JVM 会将整个 heap 的信息 dump 到一个文件,heap 如果比较大的话会导致这个过程比较耗时,并且执行的过程中为了保证 dump 的信息是可靠的会暂停应用。

该命令通常用来分析内存泄漏 OOM,通常做法是:

  • 首先配置 JVM 启动参数,让 JVM 在遇到 OutOfMemoryError 时自动生成 Dump 文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
  • 使用命令 Dump Heap 信息
jmap -dump:format=b,file=/path/heap.bin pid
  • 使用 MAT 分析工具,如 jhat 命令分析 hprof 文件

常用命令

  • 查看大对象:
jmap -histo <pid>|less
  • 查看对象数最多的对象,并按降序排序输出:
jmap -histo <pid>|grep alibaba|sort -k 2 -g -r|less
  • 查看占用内存最多的对象,并按降序排序输出:
jmap -histo <pid>|grep alibaba|sort -k 3 -g -r|less
<think>好的,我现在需要详细解释jmap命令的用法和参数。首先,用户已经提供了一些引用资料,我需要仔细阅读这些引用内容,确保准确理解每个参数的作用和命令的适用场景。 首先,根据引用[2]和[3],jmap的主要功能是生成堆转储快照(dump文件)、查看堆和方法区的详细信息,以及finalize执行队列。引用[4]提到jmap还可以分析内存泄漏和大对象,这需要体现在应用场景部分。 接下来,我需要整理各个参数。引用[1]中的示例是jmap -dump:format=b,file=heapdump.hprof pid,说明-dump选项的用法。引用[4]还提到了其他参数如-finalizerinfo和-heap,需要详细说明每个参数的作用。 需要注意格式要求:行内数学公式用$...$,独立公式用$$...$$。不过在这个问题中可能涉及数学公式较少,但如果有相关例子可能需要应用。另外,要使用中文回答,结构清晰,分步骤说明。 用户的问题是关于jmap的使用方法和参数详解,因此需要按功能分类参数,并给出具体示例。例如,生成dump文件、查看堆信息、类加载器统计等。 还要注意引用标注的正确使用,在相关解释后添加对应的引用标记,如[^2][^3][^4]。 然后需要生成相关问题。根据用户提供的示例,问题应围绕jmap的进一步应用、参数差异、使用注意事项等展开。 最后,确保回答符合系统级指令,特别是LaTeX语法正确和引用正确。检查是否有遗漏的参数或错误的信息,比如不同JDK版本中jmap的变化是否需要提及?引用中没有提到版本差异,可能不需要涉及,保持现有信息即可。</think>### jmap命令详解 jmapJava Virtual Machine Memory Map)是JDK提供的用于分析Java堆内存的工具,支持生成堆转储快照、查看内存分布及垃圾回收信息。以下是主要参数及用法: --- #### **1. 生成堆转储文件(Heap Dump)** **命令格式** ```bash jmap -dump:[live,]format=b,file=<filename> <pid> ``` - **作用**:生成堆内存快照,用于离线分析内存泄漏或对象分布。 - **参数说明**: - `live`:仅导出存活对象(会触发Full GC)[^2][^4]。 - `format=b`:二进制格式。 - `file=<filename>`:输出文件名(如`heapdump.hprof`)。 - **示例**: ```bash jmap -dump:live,format=b,file=heapdump.hprof 1234 ``` --- #### **2. 查看堆内存摘要** **命令格式** ```bash jmap -heap <pid> ``` - **作用**:显示堆内存配置、使用情况及垃圾回收器类型。 - **输出内容**: - 堆的分代(新生代/老年代)空间分配。 - 垃圾回收算法(如Parallel GC、G1 GC)。 - 当前内存使用率。 --- #### **3. 查看类实例统计** **命令格式** ```bash jmap -histo[:live] <pid> ``` - **作用**:统计类实例数量和内存占用。 - **参数说明**: - `live`:仅统计存活对象[^4]。 - **输出示例**: ``` num #instances #bytes class name 1: 1000000 200000000 java.lang.String ``` --- #### **4. 查看等待终结的对象** **命令格式** ```bash jmap -finalizerinfo <pid> ``` - **作用**:显示`finalize()`方法队列中的对象数量[^4]。 --- #### **5. 查看类加载器数据** **命令格式** ```bash jmap -clstats <pid> ``` - **作用**:输出类加载器的元数据,包括加载的类数量和占用空间[^3]。 --- #### **注意事项** 1. **权限要求**:需与目标JVM进程用户一致,或具备`sudo`权限。 2. **生产环境慎用**:`-dump:live`和`-histo:live`会触发Full GC,可能导致服务暂停。 3. **替代工具**:JDK 8+推荐使用`jcmd`替代部分功能(如`jcmd <pid> GC.heap_dump`生成堆转储)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值