jmap命令的使用

本文介绍如何使用jmap命令打印Java进程内存内的所有对象情况,包括对象产生与数量,以及如何通过文本对比工具分析GC回收情况。同时提供jmap命令的详细参数说明与使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、介绍


打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。

可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool),使用参见:http://blog.youkuaiyun.com/fenglibing/archive/2011/04/02/6298326.aspx)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。

64位机上使用需要使用如下方式:

jmap -J-d64 -heap pid

2、命令格式

SYNOPSIS

jmap [ option ] pid

jmap [ option ] executable core

jmap [ option ] [server-id@]remote-hostname-or-IP

3、参数说明

1)options:

executable Java executable from which the core dump was produced.

(可能是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务

2)基本参数:

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.

-finalizerinfo 打印正等候回收的对象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.

-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.

-h | -help 打印辅助信息

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

pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.

4、使用示例

1)[fenglb@ccbu-156-5 ~]$ jmap -histo 4939

[输出较多这里不贴了]

2)[fenglb@ccbu-156-5 ~]$ jmap -dump:format=b,file=test.bin 4939

Dumping heap to /home/fenglb/test.bin ...

Heap dump file created

<think>我们被要求回答关于jmap命令执行的问题。jmap是JDK自带的命令行工具,用于生成Java堆内存快照(heap dump)和查看堆内存中的对象统计信息等。 下面将详细解释jmap命令的常见用法、原理以及注意事项。</think>### Java `jmap` 命令深度解析 `jmap`(Java Memory Map)是 JDK 自带的命令行工具,用于分析 JVM 堆内存使用情况。以下是核心功能和使用方法: #### **核心功能** | 功能 | 命令格式 | 作用 | |------|----------|------| | 堆直方图 | `jmap -histo <pid>` | 显示堆中对象统计 | | 堆转储 | `jmap -dump:format=b,file=heap.bin <pid>` | 生成堆快照文件 | | 堆摘要 | `jmap -heap <pid>` | 显示堆配置和使用情况 | | 类加载器统计 | `jmap -clstats <pid>` | 显示类加载器元数据 | | 最终化队列 | `jmap -finalizerinfo <pid>` | 显示等待 finalize 的对象 | --- #### **1. 堆直方图分析(最常用)** ```bash jmap -histo:live 1234 # 1234 是Java进程PID ``` **输出示例**: ``` num #instances #bytes class name ------------------------------------------- 1: 1500000 200000000 [B # byte数组 2: 800000 120000000 java.lang.String 3: 500000 40000000 java.lang.Object 4: 30000 3600000 java.lang.Class ``` **字段解析**: - `#instances`:对象实例数量 - `#bytes`:对象占用总字节数 - `class name`:类名(`[C`=char数组, `[B`=byte数组) --- #### **2. 生成堆转储文件** ```bash jmap -dump:live,format=b,file=heapdump.hprof 1234 ``` **关键参数**: - `live`:只转储存活对象(触发 Full GC) - `format=b`:二进制格式(兼容 MAT、VisualVM 等工具) - `file`:输出文件路径 **文件分析工具**: 1. Eclipse Memory Analyzer (MAT) 2. VisualVM 3. JProfiler --- #### **3. 堆内存配置查看** ```bash jmap -heap 1234 ``` **输出内容**: ```java Attaching to process ID 1234, please wait... Debugger attached successfully. Server compiler detected. JVM version is 11.0.15+10-LTS-58 // 堆配置信息 Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 2147483648 (2048.0MB) NewSize = 715784192 (682.5MB) MaxNewSize = 715784192 (682.5MB) OldSize = 1431699456 (1365.5MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) G1HeapRegionSize = 0 (0.0MB) // 内存区域使用情况 Heap Usage: PS Young Generation Eden Space: capacity = 536870912 (512.0MB) used = 271564872 (258.97MB) free = 265306040 (253.03MB) 50.58% used From Space: capacity = 89128960 (85.0MB) used = 0 (0.0MB) free = 89128960 (85.0MB) 0.0% used To Space: capacity = 89128960 (85.0MB) used = 0 (0.0MB) free = 89128960 (85.0MB) 0.0% used PS Old Generation capacity = 1431699456 (1365.5MB) used = 0 (0.0MB) free = 1431699456 (1365.5MB) 0.0% used ``` --- #### **4. 类加载器统计** ```bash jmap -clstats 1234 ``` **输出示例**: ``` ClassLoader Parent #Classes #Bytes #ParentLoaders jdk.internal.loader.ClassLoaders$AppClassLoader null 2000 50MB 0 jdk.internal.loader.ClassLoaders$PlatformClassLoader AppClassLoader 1500 30MB 1 ``` --- #### **5. 使用注意事项** 1. **生产环境风险**: - `-histo:live` 和 `-dump:live` 会触发 Full GC - 避免在高负载时使用,可能导致 STW 暂停 2. **权限要求**: - Linux/Mac:用户需与 JVM 进程所有者一致 - Windows:需管理员权限 3. **替代方案**: ```bash # 安全获取直方图(不触发GC) jcmd 1234 GC.class_histogram # 安全生成堆转储 jcmd 1234 GC.heap_dump heapdump.hprof ``` 4. **容器环境**: ```bash # 在容器内执行 docker exec <container> jmap -histo 1 # PID 1通常是Java进程 ``` --- #### **6. 代码级内存分析(结合MAT)** 在 Eclipse MAT 中分析堆转储: ```java // 查找内存泄漏的代码示例 public class MemoryLeak { static List<byte[]> leakList = new ArrayList<>(); public static void main(String[] args) { while (true) { leakList.add(new byte[1024 * 1024]); // 每秒泄漏1MB try { Thread.sleep(1000); } catch (InterruptedException e) {} } } } ``` **MAT 分析步骤**: 1. 打开 `heapdump.hprof` 2. 执行 **Leak Suspects Report** 3. 查看 **Biggest Objects by Retained Size** 4. 定位到 `MemoryLeak.leakList` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值