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

news2024/10/6 16:17:46

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内存分析和调优的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kubernetes】Kubernetes之YAML文件详解

YAML 一、YAML 的概述1. Kubernetes 支持资源管理格式2. YAML 语法格式 二、YAML 文件1. 如何获取 api 资源相关信息2. 编写资源配置文件2.1 手动编写 yaml 文件详解K8S中的port 2.2 使用镜像生成 yaml 文件2.3 根据现有资源导出 yaml 文件 总结1. 如何获取资源清单文件&#x…

[LeetCode - Python]349. 两个数组的交集(Easy);350. 两个数组的交集 II(Easy)

题目&#xff1a; 349. 两个数组的交集(Easy) 代码 1.哈希表 set清重 两次遍历&#xff1a; class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:dict {}ret []for i in set(nums1) :if i not in dict:dict[i] 0 for j in …

selenium+python —— 实现基本自动化测试

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

centos7 ESXi 磁盘扩充容量

1、背景 有一天&#xff0c;突然程序报空间不足了。。。。。。 2023-06-23 02:26:51.631 UTC [26190] LOG: could not open temporary statistics file "pg_stat_tmp/global.tmp": No space left on device 2023-06-23 02:26:51.631 UTC [26190] LOG: could not …

恒运资本:2倍牛股突然闪崩,业绩创新高股出炉,最高日赚近2亿

上半年哪些公司净利润有望创前史新高&#xff1f; 2倍牛股单季成绩环比下滑&#xff0c;早盘股价大跳水 A股半年报进入发表高峰期&#xff0c;仅8月7日晚间&#xff0c;就有超30家公司发表半年报和成绩预告状况&#xff0c;超七成净利润同比增加。净利润增速最高的是翔港科技&…

基于Spring Boot的影视点播网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的影视点播网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot…

Flowable-多实例

目录 概述概念多实例配置图形标记XML内容界面操作视频教程 BPMN2.0 中引入了多实例的概念&#xff0c;它是在业务流程中定义“重复”环节的一个方法&#xff0c;Flowable 对其予以了支持。配置为多实例的活动在流程运行时会创建多个活动实例&#xff0c;既可以顺序依次执行也 可…

海外市场裂变营销:打造爆炸式增长的成功之道

随着全球化的加速发展&#xff0c;越来越多的品牌开始将目光投向海外市场。然而&#xff0c;在激烈的国际竞争中脱颖而出&#xff0c;并在海外市场取得成功并不容易。在这样的背景下&#xff0c;裂变营销成为了一个备受关注的策略&#xff0c;它能够帮助品牌在海外市场快速拓展…

vue3 excel 导出功能

1.安装 xlsx 库 npm install xlsx2.创建导出函数 src/utils/excelUtils.js import * as XLSX from xlsx;const exportToExcel (fileName, datas, sheetNames) > {// 创建工作簿const wb XLSX.utils.book_new()for (let i 0; i < datas.length; i) {let data datas…

教雅川学缠论06-中枢

本系列文章之前讲的内容都只有上升和下降两类趋势&#xff0c;并没有提及盘整&#xff0c;在缠论中&#xff0c;中枢这个新词汇用来定义盘整&#xff0c;中枢&#xff1a; 1.至少由5条线段&#xff08;或笔&#xff09;组成 2.中枢是有方向的&#xff0c;中枢左右两侧外面的线&…

C语言文件操作基本方法

1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指&#xff0c;系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时&#xff0c;必须首先输出到缓冲区中。待缓冲区装满后&#xff0c;再一起输出到磁盘文件中。 从磁盘文件向内…

lz4 与 lz77 压缩算法举例

lz4算法 abcd efab cdeh 压缩过程&#xff1a; 以长度&#xff14;为滑窗&#xff0c;&#xff11;为步长&#xff0c;对abcd计算hash存入hash table&#xff0c;计算 bcde, cdef,defa,efab,fabc的 hash 分别加入 hash table&#xff0c;下一个滑窗 abcd 找到了匹配&#xf…

Acwing.883 高斯消元解线性方程组

题目 输入一个包含n个方程n个未知数的线性方程组。 方程组中的系数为实数。 求解这个方程组。 下图为一个包含m个方程n个未知数的线性方程组示例: 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含n1个实数&#xff0c;表示一个方程的n个系数以及等号右侧的常数。 …

Spark Catalog详解

前言 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗? 我:你应该静下心来好好把spark基础知识进行全面学习。 实习生:难道spark有这功能,而我没有学习过?咋弄啊? 我:学习…

WinForm项目打包成一个exe安装包教程(VS2022)

目录 1、下载扩展Microsoft Visual Studio Installer Projects 2、新建Set up项目 3、应用程序文件夹下添加文件 4、添加卸载程序 5、添加运行环境 6、添加程序图标&#xff08;选做&#xff09; 7、生成项目exe 1、下载扩展Microsoft Visual Studio Installer Projects…

深入篇【C++】C++<继承>特性详细总结附代码案例(单继承/多继承)

深入篇【C】C<继承>特性详细总结(单继承/多继承&#xff09; Ⅰ.继承理解Ⅱ.继承方式Ⅲ.基类派生类对象赋值转化Ⅳ.继承中同名成员Ⅴ.派生类的默认成员函数Ⅵ.继承中友元与静态Ⅶ.多继承<菱形继承问题>Ⅷ.继承与组合 Ⅰ.继承理解 继承的本质就是复用&#xff0c;而…

螺旋模型四象限指的是什么?

螺旋模型融合了瀑布模型、快速原型模型&#xff0c;最大的优点强调了风险分析&#xff0c;有助于将软件质量融入开发中;小分段构建大型软件&#xff0c;易于计算成本;客户参与&#xff0c;保证项目可控性。但构建过程太过繁琐&#xff0c;适合大型项目不适合小型项目。 上图是螺…

通信原理板块——基础知识(一)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、通信的基本概念——消息、信息和…

【QT】 QTabWidgetQTabBar控件样式设计(QSS)

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT控件QTabWidget&QTabBar的样式设计&#xff0c;介绍两者可以自定义的内容&#xff0c;以及如何定义&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴…

内生安全构建数据存储

一、数据安全成为防护核心&#xff0c;存储安全防护不容有失 1、数据作为企业的核心资产亟需重点保护&#xff0c;数据安全已成网络空间防护核心 2、国家高度重视关键信息基础设施的数据安全&#xff0c;存储安全已成为审核重点 二、存储安全是数据安全的关键一环&#xff0c;应…