jmap命令使用

jmap用于查看堆内存使用情况,一般结合jhat使用。

jmap -permstat pid
    打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,

使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。

使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:

 还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:

jmap -dump:format=b,file=dumpFileName

如果担心瞬间挂掉,则使用如下参数:
-XX:+HeapDumpOnOutOfMemoryError  

  我一样地对上面进程ID为21711进行Dump:

root@ubuntu:/# jmap -dump:format=b,file=/tmp/dump.dat 21711    
Dumping heap to /tmp/dump.dat ...
Heap dump file created
   dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:

root@ubuntu:/# jhat -port 9998 /tmp/dump.dat
Reading from /tmp/dump.dat...
Dump file created Tue Jan 28 17:46:14 CST 2014
Snapshot read, resolving...
Resolving 132207 objects...
Chasing references, expect 26 dots..........................
Eliminating duplicate references..........................
Snapshot resolved.
Started HTTP server on port 9998
Server is ready.
然后就可以在浏览器中输入主机地址:9998查看了:

<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、付费专栏及课程。

余额充值