JVM中工具jmap的使用

本文介绍如何使用jmap工具分析Java应用的内存状况,包括堆配置、使用情况及对象直方图,适用于Java开发者进行性能调优。
jmap <Options> pid 

参数如下:  
-heap:打印jvm heap的情况  
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。  
-histo:live :只打印存活对象的情况  
-permstat:打印permanent generation heap情况  
[root@localhost ~]# jmap -heap 19600
Attaching to process ID 19600, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 515899392 (492.0MB)
   NewSize                  = 11010048 (10.5MB)
   MaxNewSize               = 171966464 (164.0MB)
   OldSize                  = 22544384 (21.5MB)
   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 = 35651584 (34.0MB)
   used     = 4152920 (3.9605331420898438MB)
   free     = 31498664 (30.039466857910156MB)
   11.64862688849954% used
From Space:
   capacity = 3670016 (3.5MB)
   used     = 1703936 (1.625MB)
   free     = 1966080 (1.875MB)
   46.42857142857143% used
To Space:
   capacity = 3670016 (3.5MB)
   used     = 0 (0.0MB)
   free     = 3670016 (3.5MB)
   0.0% used
PS Old Generation
   capacity = 22544384 (21.5MB)
   used     = 10071824 (9.605239868164062MB)
   free     = 12472560 (11.894760131835938MB)
   44.67553427053053% used

15456 interned Strings occupying 1376896 bytes.

 

### ### JVM jmap 工具的作用及使用方法 JVM 中的 `jmap` 是一个用于生成 Java 堆内存快照并分析堆中对象分布情况的工具。它可以帮助开发人员和运维人员排查内存泄漏、定位大对象占用、检查类加载状态等问题。通过 `jmap`,可以获取当前 JVM 的堆结构信息、对象统计信息以及生成堆转储文件(heap dump)[^1]。 #### 作用与功能 - **生成堆快照**:支持生成完整的堆转储文件,可用于后续图形化分析。 - **查看堆详细信息**:包括使用的垃圾回收器、堆参数配置、分代状况等。 - **对象统计信息**:展示堆中各类的对象数量及其占用内存总量。 - **类加载信息**:以 ClassLoader 为单位显示永久代或元空间中的类加载情况。 - **强制生成堆快照**:在 JVM 对常规命令无响应时,仍可通过 `-F` 参数强制生成堆快照。 - **Finalizer 队列信息**:显示等待 Finalizer 线程执行 `finalize()` 方法的对象列表(仅限 Linux/Solaris 平台)[^3]。 #### 使用方法与常见命令 ##### 查看堆总体信息 ```bash jmap -heap <pid> ``` 该命令用于查看目标 JVM 的堆配置详情,包括初始大小、最大容量、各代划分以及使用的垃圾回收策略等。 ##### 显示对象统计信息 ```bash jmap -histo:live <pid> ``` 此命令输出堆中所有存活对象的类名、实例数及总占用字节数。适用于快速识别占用内存最多的类,有助于初步判断是否存在潜在的内存泄漏问题。 ##### 生成堆转储文件 ```bash jmap -dump:format=b,file=heapdump.hprof <pid> ``` 用于导出二进制格式的堆快照文件,可配合 MAT(Memory Analyzer Tool)或 VisualVM 进行深入分析。若 JVM 处于不可响应状态,可添加 `-F` 参数强制生成快照: ```bash jmap -F -dump:format=b,file=heapdump.hprof <pid> ``` ##### 检查类加载情况 ```bash jmap -clstats <pid> ``` 该命令展示每个 ClassLoader 加载的类数量及元数据占用情况,常用于诊断类重复加载或元空间溢出问题[^1]。 ##### 查看 Finalizer 队列(Linux/Solaris) ```bash jmap -finalizerinfo <pid> ``` 列出当前等待执行 `finalize()` 方法的对象,帮助发现因 Finalizer 线程阻塞导致的资源释放延迟问题[^3]。 #### 实战场景示例 ##### 排查 OutOfMemoryError (OOM) 当应用抛出 `OutOfMemoryError` 异常时,首先使用以下命令查看老年代(Old 区)内存占用情况: ```bash jmap -heap <pid> ``` 随后通过对象统计信息找出内存占用最大的类: ```bash jmap -histo:live <pid> ``` 最后导出堆转储文件,并使用 MAT 分析“GC Roots → 大对象链路”,从而定位具体是哪些对象未被正确释放。 ##### 寻找内存泄漏 持续观察某个类的实例数量是否不断增长,可通过多次执行 `jmap -histo:live` 来比较差异。同时结合 `-clstats` 检查是否存在 ClassLoader 被反复创建的情况。最终通过 `.hprof` 文件分析无法释放的对象引用链来确认内存泄漏的根本原因[^2]。 #### 注意事项与最佳实践 - **权限限制**:目标进程必须与当前用户一致,或使用 `sudo` 执行命令。 - **性能影响**:`jmap` 在执行过程中可能导致短暂的 Stop-The-World(STW),线上环境应谨慎使用- **不支持远程操作**:只能用于本地 JVM 进程,无法跨网络操作。 - **版本一致性**:确保使用的 `jmap` 版本与目标 JVM 所属 JDK 版本一致,避免兼容性问题[^1]。 #### 最佳使用时机 - **内存异常初步排查**:使用 `jmap -histo:live` 快速识别大对象。 - **需要图形化分析**:导出 `.hprof` 文件供 MAT 或 VisualVM 分析。 - **JVM 卡死或 GC 死循环**:使用 `-F` 参数强制生成堆快照。 - **类加载问题诊断**:通过 `jmap -clstats` 检查 ClassLoader 行为[^1]。 #### 配套工具组合拳 | 工具 | 用途说明 | |-----------|------------------------------------| | `jmap` | 内存快照、实例分布、堆转储 | | `jstack` | 查看线程状态,配合内存分析 | | `jstat` | 监控 GC 行为与内存使用趋势 | | `MAT` / `VisualVM` | 图形化分析 `.hprof` 文件 | | `jps` | 快速获取 Java 进程 PID | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值