【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例

server/2025/1/18 10:01:18/

在Java应用程序的性能调优和故障排查中,jmap(Java Memory Map)是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况,生成堆转储文件(Heap Dump),并查看内存中的对象分布。无论是内存泄漏、堆内存溢出,还是对象分布不均的问题,jmap都能提供关键的数据支持。本文将详细介绍jmap的使用方法,并结合实际案例展示其应用场景。


1. 什么是jmap?

jmap 是JDK自带的一款命令行工具,用于生成Java进程的内存快照(Heap Dump)和查看堆内存的详细信息。它可以显示堆内存中的对象分布、类加载器信息、以及垃圾回收器的状态等。

jmap 的主要功能包括:

  • 生成堆转储文件(Heap Dump)。
  • 查看堆内存的概要信息。
  • 查看堆内存中的对象分布。
  • 查看类加载器的统计信息。

2. jmap的基本用法

2.1 查看Java进程的PID

在使用jmap之前,首先需要找到目标Java进程的PID(进程ID)。可以使用以下命令:

jps -l

输出示例:

1234 com.example.MyApplication
5678 sun.tools.jps.Jps

这里,1234 是目标Java进程的PID。

2.2 生成堆转储文件(Heap Dump)

使用以下命令生成堆转储文件:

jmap -dump:format=b,file=heapdump.hprof <PID>
  • format=b:指定输出格式为二进制(Heap Dump的标准格式)。
  • file=heapdump.hprof:指定输出文件名。
  • <PID>:目标Java进程的PID。

示例:

jmap -dump:format=b,file=heapdump.hprof 1234

生成的 heapdump.hprof 文件可以使用工具(如Eclipse MAT、VisualVM)进一步分析。
在这里插入图片描述

2.3 查看堆内存概要信息

使用以下命令查看堆内存的概要信息:

jmap -heap <PID>

输出示例:

Attaching to process ID 1234, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.12+7using thread-local object allocation.
Parallel GC with 4 thread(s)Heap Configuration:MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 1048576000 (1000.0MB)NewSize                  = 34865152 (33.25MB)MaxNewSize               = 174063616 (166.0MB)OldSize                  = 699400192 (667.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 33554432 (32.0MB)used     = 16777216 (16.0MB)free     = 16777216 (16.0MB)50.0% used
From Space:capacity = 5242880 (5.0MB)used     = 0 (0.0MB)free     = 5242880 (5.0MB)0.0% used
To Space:capacity = 5242880 (5.0MB)used     = 0 (0.0MB)free     = 5242880 (5.0MB)0.0% used
PS Old Generationcapacity = 699400192 (667.0MB)used     = 0 (0.0MB)free     = 699400192 (667.0MB)0.0% used

2.4 查看堆内存中的对象分布

使用以下命令查看堆内存中的对象分布:

jmap -histo <PID>

输出示例:

 num     #instances         #bytes  class name
----------------------------------------------	1:         12345        12345678  [B2:          6789         8765432  java.lang.String3:          2345         3456789  java.lang.Object
  • #instances:对象的实例数量。
  • #bytes:对象占用的内存大小。
  • class name:对象的类名。

2.5 查看类加载器信息

使用以下命令查看类加载器的统计信息:

jmap -clstats <PID>

输出示例:

在这里插入图片描述


3. jmap的应用案例

3.1 案例1:诊断内存泄漏

问题描述:Java应用程序运行一段时间后,堆内存持续增长,最终导致 OutOfMemoryError

解决步骤

  1. 使用 jmap 生成堆转储文件:

    jmap -dump:format=b,file=heapdump.hprof <PID>
    
  2. 使用 Eclipse MAT 或 VisualVM 分析 heapdump.hprof 文件。

  3. 查找内存中占用最多的对象,分析其引用链,定位内存泄漏的根源。

3.2 案例2:优化对象分布

问题描述:Java应用程序的性能下降,怀疑是某些对象占用了过多内存。

解决步骤

  1. 使用 jmap -histo 查看堆内存中的对象分布:

    jmap -histo <PID>
    
  2. 分析输出结果,找出占用内存最多的对象。

  3. 优化代码,减少这些对象的创建或缩短其生命周期。

3.3 案例3:分析类加载器问题

问题描述:Java应用程序在运行过程中出现 ClassNotFoundExceptionNoClassDefFoundError

解决步骤

  1. 使用 jmap -clstats 查看类加载器的统计信息:

    jmap -clstats <PID>
    
  2. 检查类加载器的父子关系,确认类加载是否正确。

  3. 修复类加载器的配置或类路径问题。


4. 注意事项

  • 权限问题:在某些操作系统上,使用 jmap 需要管理员权限。
  • 性能影响:生成堆转储文件可能会导致应用程序暂停,建议在非生产环境中使用。
  • 文件大小:堆转储文件可能非常大,确保磁盘空间充足。

5. 总结

jmap 是Java开发者进行性能调优和故障排查的利器。通过生成堆转储文件、查看堆内存信息和对象分布,开发者可以快速定位内存泄漏、优化对象分布,并解决类加载器问题。结合其他工具(如Eclipse MAT、VisualVM),jmap 的功能更加强大。


http://www.ppmy.cn/server/159326.html

相关文章

设计模式02:结构型设计模式之适配器模式使用情景及其基础Demo

1.适配器模式 用途&#xff1a;接口兼容评价&#xff1a;复杂、冗余、难以调试&#xff0c;个人认为直接在旧系统那里封装一个新实现调用旧实现就好了场景&#xff1a;系统A、B、C想调用同一个功能接口&#xff0c;但是实现细节存在差异时&#xff08;其实就是入参和出参转化处…

Linux 历史指令快捷查询与指令

相比方向键上下翻找&#xff0c;history 命令可以显示之前执行过的命令列表&#xff0c;并且可以通过序号选择并重新执行某条命令。以下是具体的使用方法&#xff1a; 1. 查看历史命令 使用 history 命令查看之前执行过的命令列表&#xff1a; history示例输出&#xff1a; 1…

网络流量测量

网络测量的重要性&#xff1a;网络测量对于网络运营、拥塞控制、负载均衡和异常检测等至关重要。其中&#xff0c;大流检测是网络测量的关键任务之一&#xff0c;它记录流的大小和ID&#xff08;通常由5元组或源/目的IP地址组成&#xff09;。 基于Sketch的方法 牺牲精度换空…

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

LeetCode 2859. 计算 K 置位下标对应元素的和

在本篇文章中&#xff0c;我们将探讨如何求解 LeetCode 上的 2859. 计算 K 置位下标对应元素的和问题。这个问题要求我们找到一个数组中特定元素的和&#xff0c;这些特定元素的下标在二进制表示中恰好有 k 个置位。 问题描述 算法分析 为了解决这个问题&#xff0c;我们可以…

软件测试 —— 自动化测试(Selenium)

软件测试 —— 自动化测试&#xff08;Selenium&#xff09; 什么是SeleniumPython安装Selenium1.安装webdirver-manager2.安装Selenium 写一个简单用例CSS_SELECTOR和XPATH浏览器快速定位页面元素浏览器的前进&#xff08;forward&#xff09;&#xff0c;后退&#xff08;bac…

父组件数据更新后通过属性传递给子组件,子组件页面未更新问题记录

改老项目bug时&#xff0c;发现父组件数据更新后通过属性传递给子组件&#xff0c;子组件页面未更新&#xff1b;查看代码原来是使用shallowRef定义的属性导致的&#xff1b;这里记录一下 子组件如下 <template> <ul><li v-for"b in filterList" :k…

学成在线_内容管理模块_创建模块工程

学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content&#xff1a;内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…