【Java可执行命令】(二十)堆转储快照文件及堆信息查看工具 jmap:生成多格式堆转储文件、打印类加载器信息及查看共享对象映射信息 ~

Java可执行命令之jmap

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
      • 3.1 语法格式
      • 3.2 生成堆转储文件
      • 3.3 执行jmap命令查看内存使用情况
      • 3.4 执行jmap命令打印对象统计信息
  • 4️⃣ 应用场景
  • 🌾 总结

在这里插入图片描述


1️⃣ 概念

jmapJava Development Kit(JDK)自带的一个工具,用于生成Java堆转储文件(Heap Dump)。它的设计目的是为了帮助开发人员分析和调试Java应用程序在运行时产生的内存问题。

jmap 命令可以通过连接到运行中的Java进程,生成指定类型的Java堆转储文件。Java堆转储文件是应用程序在特定时间点的内存快照,记录了Java虚拟机中对象的详细信息、引用关系以及当前内存使用情况。

jmap可以生成多种格式的Java堆转储文件,包括二进制格式(默认)、文本格式和HPROF二进制格式,它支持在特定的进程ID下生成堆转储文件,也支持对远程虚拟机进行操作。
同时,jmap还提供了一些额外的选项,如打印类加载器信息、查看共享对象映射等。

jmap命令通过Java虚拟机提供的 HotSpot Diagnostic 接口,连接到正在运行的Java进程,并请求生成Java堆转储文件。它使用Java虚拟机的Heap Dumper功能收集堆内对象的详细信息,并保存到指定的输出文件中。

2️⃣ 优势和缺点

优点:

  • 提供了一种快速生成Java堆转储文件的方式,方便开发人员获取内存快照;
  • 可以生成各种格式的堆转储文件,如二进制格式、文本格式等,满足不同需求;
  • 在处理大型堆转储文件时,jmap 的性能表现较好。

缺点:

  • jmap 需要连接到正在运行的Java进程,如果权限不足或者连接失败,可能无法使用该命令;
  • 处理大型堆转储文件时,可能会占用较多的系统资源,包括CPU和内存;
  • jmap 生成的堆转储文件可能过于庞大,需要额外的工具来分析和解读。

3️⃣ 使用

3.1 语法格式

jmap 命令的使用语法如下:

Usage:
    jmap [option] <pid>
        (to connect to running process)(连接到正在运行的进程)
    jmap [option] <executable <core>
        (to connect to a core file)(连接到核心文件)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)(连接到远程调试服务器)

其中,[option] 是可选的一些命令参数选项,<pid> 是Java进程的进程ID。对于命令中可选参数汇总如下:

参数说明
<none>打印与Solaris pmap相同的信息
-heap打印Java堆摘要信息
-histo[:live]打印Java堆对象的直方图;如果指定"live"子选项,则只计算存活对象
-clstats打印类加载器统计信息
-finalizerinfo打印等待终止的对象信息
-dump:<dump-options>hprof二进制格式导出Java堆。转储选项<dump-options>
live:仅转储活动对象;如果没有指定,堆中的所有对象都被转储;
format=b 二进制格式;
file=<file> 将堆转储到<file>
示例:jmap-dump:live,format=b,file=heap.bin<pid>
-F强制操作。与-dump:<dump-options> <pid>-histo一起使用,当不响应时强制执行堆转储或直方图。此模式不支持"live"子选项
-h | -help打印帮助信息
-J<flag>将参数直接传递给运行时系统

如果生成的堆转储文件过大,可以考虑使用压缩格式(如gzip)进行存储,以减少其占用空间。对于大型堆转储文件,可以使用 jhat 或其他分析工具来进一步解读和分析。

3.2 生成堆转储文件

jmap -dump:format=b,file=heapdump.hprof <pid>

上述命令会生成一个二进制格式的Java堆转储文件。如下图所示:

在这里插入图片描述
在这里插入图片描述

3.3 执行jmap命令查看内存使用情况

jmap -heap <pid>

运行上述命令可以输出Java堆的内存使用情况摘要信息,包括堆配置、空闲和已使用空间等。输出结果:

Attaching to process ID 172832, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2099249152 (2002.0MB)
   NewSize                  = 44040192 (42.0MB)
   MaxNewSize               = 699400192 (667.0MB)
   OldSize                  = 88080384 (84.0MB)
   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 = 33554432 (32.0MB)
   used     = 4710360 (4.492149353027344MB)
   free     = 28844072 (27.507850646972656MB)
   14.03796672821045% 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 Generation
   capacity = 88080384 (84.0MB)
   used     = 0 (0.0MB)
   free     = 88080384 (84.0MB)
   0.0% used

3162 interned Strings occupying 259504 bytes.

这个执行结果显示了与Java堆配置和使用相关的信息。下面是对每个部分的解释:

  1. Attaching to process ID 172832, please wait...:正在连接到进程ID为172832的进程,请稍等…
  2. Debugger attached successfully.:成功附加调试器。
  3. Server compiler detected.:检测到服务器编译器。说明正在使用JVM的C2(客户端编译器)进行即时编译。
  4. JVM version is 25.202-b08:JVM版本号为25.202-b08。

接下来是Java堆的配置信息:

  1. using thread-local object allocation.:使用线程本地对象分配。
  2. Parallel GC with 10 thread(s):采用并行GC(垃圾收集器),共有10个线程。

Heap Configuration 部分列出了Java堆的配置设置,包括以下目录:

  1. MinHeapFreeRatio:最小的可用于自由空间的堆比例。
  2. MaxHeapFreeRatio:最大的可用于自由空间的堆比例。
  3. MaxHeapSize:堆的最大大小。
  4. NewSize:新生代的初始大小。
  5. MaxNewSize:新生代的最大大小。
  6. OldSize:老年代的初始大小。
  7. NewRatio:新生代与老年代的比例。
  8. SurvivorRatio:Eden区和Survivor区的比例。
  9. MetaspaceSize:元空间(Metaspace)的初始大小。
  10. CompressedClassSpaceSize:压缩类空间的大小。
  11. MaxMetaspaceSize:元空间的最大大小。
  12. G1HeapRegionSize:使用G1收集器时的堆区域大小。

Heap Usage 部分显示了Java堆的使用情况,包括各个区域的容量、已用空间和空闲空间:

  1. PS Young Generation:表示Parallel Scavenge GC中的新生代(Parallel Scavenge是一种垃圾收集器)
  2. Eden Space:伊甸园区域的容量、已用空间和空闲空间。
  3. From Space:幸存者(Survivor)区中的From区域的容量、已用空间和空闲空间。
  4. To Space:幸存者(Survivor)区中的To区域的容量、已用空间和空闲空间。
  5. PS Old Generation:表示Parallel Scavenge GC中的老年代。
  6. capacity:容量。
  7. used:已使用的空间。
  8. free:可用的空闲空间。
  9. 最后一行 3162 interned Strings occupying 259504 bytes.:表示共有3162个interned字符串占用了259504字节的内存。

这些信息提供了有关Java堆配置和使用情况的详细数据,可用于分析和优化应用程序的内存使用。

3.4 执行jmap命令打印对象统计信息

jmap -histo <pid>

上述命令会输出Java堆中各个类的实例数目和内存占用情况,可以帮助开发人员了解应用程序的内存使用情况。输出结果:


 num     #instances         #bytes  class name
----------------------------------------------
   1:           660        2093048  [I
   2:          1185        1171784  [B
   3:          7723         910880  [C
   4:          5893         141432  java.lang.String
   5:           691          78976  java.lang.Class
   6:          1294          60888  [Ljava.lang.Object;
   7:           791          31640  java.util.TreeMap$Entry
   8:           628          25120  java.util.LinkedHashMap$Entry
   9:           456          22144  [Ljava.lang.String;
  10:           365          11680  java.util.HashMap$Node
  11:            38          11584  [Ljava.util.HashMap$Node;
  12:           152          10944  java.lang.reflect.Field
  13:           435          10440  java.lang.StringBuilder
  14:           242           7744  java.util.Hashtable$Entry
  15:           233           7456  java.io.File
  16:           101           6464  java.net.URL
  17:           241           5784  java.lang.StringBuffer
  18:           125           5000  java.lang.ref.SoftReference
  19:           258           4128  java.lang.Integer
  20:           115           3680  java.util.concurrent.ConcurrentHashMap$Node
  21:            25           3648  [Ljava.util.Hashtable$Entry;
  22:            72           3456  java.nio.HeapCharBuffer
  23:            71           3408  java.nio.HeapByteBuffer
  24:            42           3360  [S
  25:             8           3008  java.lang.Thread
  26:             5           2568  [J
  27:            20           2496  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  28:            44           2464  sun.misc.URLClassPath$JarLoader
  29:             2           2384  [[Ljava.lang.Object;
  30:            89           2136  java.net.Parts
  31:             2           2080  [[C
  32:            26           2080  java.lang.reflect.Constructor
  ...
 369:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total         23572        4710360

这个执行结果是一个对象直方图,列出了不同类的实例数量和占用的内存大小。下面是对每个列的解释:

  1. num:序号,表示第几行。
  2. #instances:实例数量,表示内存中存在多少个该类的实例。
  3. #bytes:内存大小,表示该类实例所占用的总字节数。
  4. class name:类名,表示相应实例的类名。

接下来的表格显示了一系列对象的统计数据,从最多实例到最少实例进行排序。其中每一行对应一个类的统计信息。

例如,在第4行:

  • 4: 5893 141432 java.lang.String
    表示有5893个java.lang.String类的实例,占用141,432字节的内存。

最后一行 Total 23572 4710360 表示总共有23,572个对象实例,占用4,710,360字节的内存。

通过分析对象直方图,可以了解系统中不同类型的对象的创建情况和内存消耗,从而帮助开发人员找到内存相关的问题,并进行性能优化和内存管理。

4️⃣ 应用场景

  • 分析Java应用程序的内存使用情况,包括堆大小、对象数量、内存泄漏等问题;
  • 为内存相关的性能调优提供数据支持,比如查找常驻内存的对象、优化内存分配等;
  • 在应用程序出现内存溢出或性能问题时,生成堆转储文件进行进一步分析和定位问题。

需要注意,jmap 需要操作系统级别的权限来连接到正在运行的Java进程,需要确保当前用户有足够的权限。在处理大型堆转储文件时,可能会占用较多的系统资源,请确保足够的CPU和内存。
而如果生成的堆转储文件非常庞大时,需要使用专门的工具(如 jhatMAT等)进行解读和分析。

MAT(Memory Analyzer Tool)是一个Java堆分析器,它是一款强大的开源工具,用于分析Java应用程序在运行时产生的内存问题。MAT可以帮助开发人员快速定位和解决内存泄漏、大对象占用过多内存、内存溢出等常见的内存相关问题。

MAT提供了多种功能和特性:

  1. 内存快照分析:可以加载并分析通过jmap或者其他工具生成的Java堆转储文件(如hprof格式),以获取详细的内存使用情况。
  2. 强大的查询和筛选功能:支持丰富的查询语言和过滤条件,方便开发人员查找特定类型的对象,快速定位问题所在。
  3. 可视化对象图:以直观的方式展示Java堆中的对象及其引用关系,帮助开发人员理解对象之间的关联,从而更好地排查内存问题。
  4. 内存报告和统计:生成详细的内存报告,包括对象数量、内存占用、GC根引用等统计信息,帮助开发人员分析对象的分布和趋势。
  5. 内存泄漏检测:自动检测可能造成内存泄漏的对象,识别存在潜在泄漏的代码路径,辅助开发人员修复内存问题。
  6. 快速分析和低内存占用:MAT具有高效的内存使用和分析性能,即使在处理大型堆转储文件时也能保持较低的内存占用。

🌾 总结

jmap命令是Java开发工具包(JDK)中的一个有用工具,用于生成Java堆转储文件以及查看堆和对象统计信息。通过连接到运行中的Java进程,jmap提供了快速生成内存快照的方式,帮助开发人员检测和调试Java应用程序的内存问题。然而,使用时需要注意权限、资源消耗以及处理生成的大型转储文件的需求。综上所述,jmap是一个强大的工具,适用于各种Java内存分析和调优的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/64990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源数据库Mysql_DBA运维实战 (部署服务篇)

前言❀ 1.数据库能做什么 2.数据库的由来 数据库的系统结构❀ 1.数据库系统DBS 2.SQL语言(结构化查询语言) 3.数据访问技术 部署Mysql❀ 1.通过rpm安装部署Mysql 2.通过源码包安装部署Mysql 前言❀ 1.数据库能做什么 a.不论是淘宝&#xff0c;吃鸡&#xff0c;爱奇艺…

挖掘Java集合:深入探索List接口与HashSet

文章目录 引言LinkedList&#xff1a;双向链表的实现构造方法LinkedList中的常用方法HashSet&#xff1a;无序且唯一的集合HashSet的实现方式LinkedHashSet&#xff1a;有序且唯一可变长度参数结论 引言 在广阔的Java编程领域中&#xff0c;集合就如同宝库&#xff0c;提供了多…

C语言 用数组名作函数参数

当用数组名作函数参数时&#xff0c;如果形参数组中各元素的值发生变化&#xff0c;实参数组元素的值随之变化。 1.数组元素做实参的情况&#xff1a; 如果已经定义一个函数&#xff0c;其原型为 void swap(int x,int y);假设函数的作用是将两个形参&#xff08;x,y&#xf…

ArcGIS制作带蒙版的遥感影像地图

这次文章我们来介绍一下&#xff0c;如何通过一个系统的步骤完成ArcGIS制作带蒙版的遥感影像地图。 主要的步骤包括&#xff1a; 1 添加行政区划数据 2 导出兴趣去乡镇矢量范围 3 添加遥感影像底图 4 制作蒙版 5 利用自动完成面制作蒙版 6 标注乡镇带晕渲文字 7 …

01《Detecting Software Attacks on Embedded IoT Devices》随笔

2023.08.05 今天读的是一篇博士论文 论文传送门&#xff1a;Detecting Software Attacks on Embedded IoT Devices 看了很长时间&#xff0c;发现有一百多页&#xff0c;没看完&#xff0c;没看到怎么实现的。 摘要 联网设备的增加使得嵌入式设备成为各种网络攻击的诱人目标&…

Cloud Studio实战——热门视频Top100爬虫应用开发

最近Cloud Studio非常火&#xff0c;我也去试了一下&#xff0c;感觉真的非常方便&#xff01;我就以Python爬取B站各区排名前一百的视频&#xff0c;并作可视化来给大家分享一下Cloud Studio&#xff01;应用链接&#xff1a;Cloud Studio实战——B站热门视频Top100爬虫应用开…

lwip不同的socket分别作为监听和客户端连接

在LWIP中&#xff0c;一个网络设备&#xff08;如以太网卡&#xff09;可以创建多个socket&#xff0c;用于处理不同的网络连接。一般&#xff0c;你可以创建一个socket用于监听&#xff08;listen&#xff09;连接&#xff0c;另一个socket用于主动发起&#xff08;connect&am…

华为OD机试(含B卷)真题2023 算法分类版,58道20个算法分类,如果距离机考时间不多了,就看这个吧,稳稳的

目录 一、数据结构1、线性表2、优先队列3、滑动窗口4、二叉树5、并查集6、栈 二、算法1、基础算法2、字符串3、图4、动态规划5、数学 三、漫画算法2&#xff1a;小灰的算法进阶参与方式 很多小伙伴问我&#xff0c;华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如…

jenkins使用gitlab标签发布

关于jenkins git parameter使用gitlab标签发布和分支发布的用法 手动配置的我就不说了&#xff0c;点点点就行&#xff0c;主要是说一下在pipeline里如何使用 通过分支拉取gitlab仓库代码 pipeline {agent anyenvironment {}parameters {gitParameter(branch: , branchFilte…

ASP.NET Core学习路线图

说明 1. 先决条件 - [C#](https://www.pluralsight.com/paths/csharp) - [Entity Framework](https://www.pluralsight.com/search?qentity%20framework%20core) - [ASP.NET Core](https://www.pluralsight.com/search?qasp.net%20core) - SQL基础知识 2. 通用开发技能 -…

vue3+vite配置多入口文件

1.修改vite.config.ts 文件&#xff1a; 2.在src目录底下建相应的html文件和对应的ts入口文件和vue文件&#xff0c;如下图&#xff1a; npm run dev运行后本地访问&#xff1a; http://127.0.0.1:5173/home_index.htmlnpm run build打包后的结构如图&#xff1a;

Android Studio翻译插件

进入File->Settings->Plugins界面&#xff0c;搜索Translation&#xff0c;选择这个 重启AS后&#xff0c;选中目标单词右键点击Translate即可&#xff1a;

官宣了!Nank南卡耳机签约世界游泳冠军傅园慧!共塑国货好品质

骨传导开放式耳机行业领导品牌Nank南卡今日宣布&#xff0c;将邀请世界游泳冠军傅园慧为品牌形象代言人&#xff0c;Nank南卡对品牌推广大使的选择并非跟随流量的潮向&#xff0c;而是甄选与自身价值观更为相符的游泳冠军。赛场上的傅园慧所体现的不怕输、不放弃&#xff0c;坚…

[LitCTF 2023]Http pro max plus

打开环境后提示说&#xff0c;只允许在本地访问&#xff0c;本地访问&#xff0c;还是想到了XFF字段 好家伙的&#xff0c;直接被嘲讽&#xff0c;还是了解太少了&#xff0c;都不知道还有没有其他方式可以控制ip地址信息 经过查看wp&#xff0c;得知一种新的方式 Client-IP …

【MySQL】基础知识(一)

MySQL基础知识&#xff08;一&#xff09; 文章目录 MySQL基础知识&#xff08;一&#xff09;00 MySQL安装01 数据库介绍1.1 什么是数据库1.2数据库分类 02 SQL分类03 数据库操作3.1显示数据库3.2创建数据库3.3选中数据库3.4删除数据库 04 常用数据类型4.1数值类型4.2字符串类…

用于实体对齐的联合学习实体和关系表示2019 AAAI 8.7+8.8

用于实体对齐的联合学习实体和关系表示 摘要介绍相关工作实体对齐图卷积网络 问题公式我们的方法整体架构初步实体对齐图卷积层对齐训练 近似关系表示联合实体和关系对齐 实验总结 摘要 实体对齐是在不同知识图之间集成异构知识的一种可行方法。该领域的最新发展通常采用基于嵌…

数字电路基础(MOS管)

1.PMOS和NMOS MOS晶体管的物理结构如下&#xff0c;由衬底和注入粒子的材质不同分为PMOS和NMOS。 2.CMOS CMOS由PMOS和NMOS组成&#xff0c;是一个反相器&#xff0c;其电路图如下所示。当In为1时&#xff0c;PMOS断开&#xff0c;NMOS导通&#xff0c;Out输出为0&#xff1b;…

Springboot @Validated注解详细说明

在Spring Boot中&#xff0c;Validated注解用于验证请求参数。它可以应用在Controller类或方法上 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </depen…

【工程优化问题】基于多种智能优化算法的压力容器设计问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Docker】docker镜像+nginx部署vue项目:

文章目录 一、文档&#xff1a;二、打包vue项目&#xff1a;三、配置nginx&#xff1a;四、配置Dockerfile&#xff1a;五、构建镜像&#xff1a;六、运行容器&#xff1a;七、最终效果&#xff1a; 一、文档&#xff1a; 【1】菜鸟教程&#xff1a;https://www.runoob.com/do…