jmap使用

常用命令 

jmap -heap PID

jmap -histo PID | head -20

jmap -dump:format=b,file=heap_dump.hprof PID

jmap 是 Java 开发工具包(JDK)提供的一个命令行工具,用于生成 Java 进程的内存映射信息。它可以帮助开发者分析 Java 堆内存的使用情况、生成堆转储文件(Heap Dump),以及查看类的内存分布等。


1. jmap 的作用

  • 生成堆转储文件:将 Java 堆内存的快照保存到文件中,用于后续分析。

  • 查看堆内存摘要:显示堆内存的使用情况,如对象数量、占用空间等。

  • 查看类加载器信息:显示类加载器的统计信息。

  • 查看永久代(PermGen)或元空间(Metaspace)信息:显示永久代或元空间的使用情况。


2. jmap 的使用方法

2.1 基本语法

bash

复制

jmap [options] <pid>
  • <pid>:Java 进程的进程 ID。

  • [options]:可选参数,用于控制输出内容或生成堆转储文件。

2.2 常用选项
  • -heap:显示堆内存的摘要信息。

  • -histo:显示堆内存中对象的直方图(按类和占用空间排序)。

  • -dump:生成堆转储文件(Heap Dump)。

  • -finalizerinfo:显示等待终结的对象信息。

  • -clstats:显示类加载器的统计信息。

  • -F:强制生成堆转储文件(适用于进程无响应的情况)。


3. 使用示例

3.1 获取 Java 进程的 PID

在生成堆转储文件之前,需要先获取 Java 进程的 PID。可以使用以下命令:

bash

复制

jps -l

输出示例:

复制

12345 com.example.Main
67890 sun.tools.jps.Jps
  • 12345 是目标 Java 进程的 PID。

3.2 生成堆内存摘要

使用 -heap 选项显示堆内存的摘要信息:

bash

复制

jmap -heap 12345

输出示例:

复制

Attaching to process ID 12345, 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               = 174587904 (166.5MB)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 = 268435456 (256.0MB)used     = 268435456 (256.0MB)free     = 0 (0.0MB)100.0% used
From Space:capacity = 268435456 (256.0MB)used     = 268435456 (256.0MB)free     = 0 (0.0MB)100.0% used
To Space:capacity = 268435456 (256.0MB)used     = 0 (0.0MB)free     = 268435456 (256.0MB)0.0% used
PS Old Generationcapacity = 699400192 (667.0MB)used     = 699400192 (667.0MB)free     = 0 (0.0MB)100.0% used
3.3 生成对象直方图

使用 -histo 选项显示堆内存中对象的直方图:

bash

复制

jmap -histo 12345

输出示例:

复制

 num     #instances         #bytes  class name
----------------------------------------------1:         10000       10000000  java.lang.String2:          5000        5000000  java.util.HashMap$Node3:          2000        2000000  java.lang.Object
3.4 生成堆转储文件

使用 -dump 选项生成堆转储文件:

bash

复制

jmap -dump:format=b,file=heap_dump.hprof 12345
  • 将堆转储文件保存为 heap_dump.hprof

3.5 强制生成堆转储文件

如果 Java 进程无响应,可以使用 -F 选项强制生成堆转储文件:

bash

复制

jmap -dump:format=b,file=heap_dump.hprof -F 12345
3.6 查看类加载器信息

使用 -clstats 选项显示类加载器的统计信息:

bash

复制

jmap -clstats 12345

4. 堆转储文件的分析

生成的堆转储文件(.hprof)可以使用以下工具进行分析:

  • Eclipse MAT(Memory Analyzer Tool):功能强大的堆转储分析工具。

  • VisualVM:JDK 自带的图形化分析工具。

  • JProfiler:商业化的 Java 性能分析工具。


5. 使用场景

5.1 内存泄漏分析
  • 通过堆转储文件分析对象的引用关系,找出内存泄漏的原因。

5.2 内存使用优化
  • 查看堆内存中对象的分布,优化内存使用。

5.3 类加载器问题诊断
  • 查看类加载器的统计信息,诊断类加载器相关的问题。


6. 总结

  • jmap 是 Java 开发者必备的诊断工具,用于生成堆转储文件和查看堆内存信息。

  • 通过分析堆转储文件,可以诊断内存泄漏、优化内存使用等。

  • 结合其他 JDK 工具(如 jpsjstackjstat),可以更全面地分析和调优 Java 应用程序。

通过掌握 jmap 的使用方法和堆转储文件的分析技巧,可以快速定位和解决 Java 应用程序的内存问题!

堆内存分析

根据你提供的 Heap Configuration(堆配置)信息,我们可以分析并解释各个参数的含义及其对 JVM 内存管理的影响。这里主要是关于堆内存、元空间和 G1 垃圾回收器的配置。

1. MinHeapFreeRatio = 40

  • 含义:堆的最小空闲比例,表示堆的空闲内存比例不能低于该值,否则 JVM 会触发垃圾回收。值为 40 表示堆空闲内存的比例不能小于 40%。
  • 影响:当堆的空闲空间低于此阈值时,JVM 会增加堆大小或进行垃圾回收来保证空闲空间不低于 40%。

2. MaxHeapFreeRatio = 70

  • 含义:堆的最大空闲比例,表示堆的空闲内存比例不能超过该值。值为 70 表示堆空闲内存的比例不能超过 70%。
  • 影响:如果堆的空闲空间超过此阈值,JVM 会缩小堆的大小,以优化内存使用。

3. MaxHeapSize = 1048576000 (1000.0MB)

  • 含义:JVM 堆的最大大小,单位为字节。这里的 1048576000 字节等于 1000 MB。
  • 影响:这是堆内存的上限,JVM 在运行过程中会尝试将堆的使用量控制在这个最大值之内。超出这个限制时,JVM 可能会触发垃圾回收或抛出 OutOfMemoryError 错误。

4. NewSize = 34865152 (33.25MB)

  • 含义:年轻代(Young Generation)的初始大小。值为 34865152 字节,即 33.25MB。
  • 影响:年轻代内存初始时分配为 33.25MB。这个值会影响到年轻代垃圾回收的频率和效率。较小的年轻代可能会导致更频繁的垃圾回收。

5. MaxNewSize = 174587904 (166.5MB)

  • 含义:年轻代的最大大小。值为 174587904 字节,即 166.5MB。
  • 影响:年轻代内存的最大容量为 166.5MB。超出这个大小后,JVM 会在年轻代内存达到最大值时进行垃圾回收。

6. OldSize = 699400192 (667.0MB)

  • 含义:老年代(Old Generation)的初始大小。值为 699400192 字节,即 667MB。
  • 影响:初始的老年代大小为 667MB。如果老年代空间满了,会触发 Full GC(完全垃圾回收)。

7. NewRatio = 2

  • 含义:年轻代与老年代内存的大小比例。值为 2 表示年轻代的内存大小是老年代的 1/2。
  • 影响:该配置影响了年轻代和老年代的内存比例。较大的 NewRatio 值意味着年轻代较小,反之则意味着年轻代较大。年轻代过小可能导致频繁的年轻代 GC。

8. SurvivorRatio = 8

  • 含义:Survivor 区域之间的内存大小比例。表示每个 Survivor 区的大小是 Eden 区的 1/8。
  • 影响:较小的 Survivor 区会导致对象较快地进入老年代,而较大的 Survivor 区则可能延迟对象进入老年代。合理的 Survivor 区大小有助于减少对象晋升到老年代的频率。

9. MetaspaceSize = 21807104 (20.8MB)

  • 含义:元空间(Metaspace)的初始大小。值为 21807104 字节,即 20.8MB。
  • 影响:元空间用于存放类元数据(类的结构信息)。JVM 会根据需要动态调整该空间的大小,但初始值为 20.8MB。

10. CompressedClassSpaceSize = 1073741824 (1024.0MB)

  • 含义:Compressed Class Space 的大小,通常为 1GB(1024MB)。该空间用于存储类的压缩形式,提高内存效率。
  • 影响:在启用了压缩类指针时,类的元数据会存放在该区域。较大的 CompressedClassSpaceSize 提高了对大规模类加载的支持。

11. MaxMetaspaceSize = 17592186044415 MB

  • 含义:元空间的最大大小。值为 17592186044415 MB,几乎是无限大(这是一个非常大的数字,理论上表示没有限制)。
  • 影响:这意味着元空间的最大大小几乎没有限制,JVM 可以根据需要动态扩展元空间,直到系统内存耗尽为止。

12. G1HeapRegionSize = 0 (0.0MB)

  • 含义:G1 垃圾回收器的堆区域大小。值为 0 表示没有启用 G1 垃圾回收器。
  • 影响:G1 回收器的堆区域大小设置为 0,意味着该 JVM 配置并没有使用 G1 垃圾回收器(可能使用的是默认的垃圾回收策略,如 Parallel GC 或 CMS)。

总结:

  • 堆内存管理:堆的最大大小为 1GB,其中年轻代和老年代的比例是 2:1,且年轻代的初始大小为 33.25MB,最大为 166.5MB。通过 MinHeapFreeRatio 和 MaxHeapFreeRatio 来控制堆的空闲内存比例,保持合理的内存使用。
  • 元空间:元空间的初始大小为 20.8MB,并且最大值几乎无限制,允许 JVM 动态扩展元空间以存储类元数据。
  • 垃圾回收器:从配置来看,这个 JVM 可能没有启用 G1 垃圾回收器(G1HeapRegionSize = 0),而是可能使用其他垃圾回收策略。

这些配置影响了 JVM 的内存管理策略、垃圾回收频率以及程序的性能。合理的堆内存配置可以提高 JVM 应用程序的性能,减少垃圾回收的停顿时间。

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

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

相关文章

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强&#xff0c;智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备&#xff0c;能够实时采集用户的腰部健康数据&#xff0c;如姿势、运动…

docker离线安装及部署各类中间件(x86系统架构)

前言&#xff1a;此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本&#xff1a;docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面&#xff0c;这里放在…

从零到一:我的元宵灯谜小程序诞生记

缘起&#xff1a;一碗汤圆引发的灵感 去年元宵节&#xff0c;我正捧着热腾腾的汤圆刷朋友圈&#xff0c;满屏都是"转发锦鲤求灯谜答案"的动态。看着大家对着手机手忙脚乱地切换浏览器查答案&#xff0c;我突然拍案而起&#xff1a;为什么不做一个能即时猜灯谜的微信…

CSS3+动画

浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程&#xff0c;css3中的属性进展都不一样&#xff0c;浏览器厂商在标准尚未明确的情况下提前支持会有风险&#xff0c;浏览器厂商对新属性的支持情况也不同&#xff0c;所有会加厂商前缀加以区分。如果某个属性…

2025.2.8——二、Confusion1 SSTI模板注入|Jinja2模板

题目来源&#xff1a;攻防世界 Confusion1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;查看网页源码信息 step 2&#xff1a;模板注入 step 3&#xff1a;构造payload&#xff0c;验证漏洞 step 4&#xff1a;已确认为SSTI漏洞中的Jinjia2…

数字电路-基础逻辑门实验

基础逻辑门是数字电路设计的核心元件&#xff0c;它们执行的是基本的逻辑运算。通过这些基本运算&#xff0c;可以构建出更为复杂的逻辑功能。常见的基础逻辑门包括与门&#xff08;AND&#xff09;、或门&#xff08;OR&#xff09;、非门&#xff08;NOT&#xff09;、异或门…

HC32功能复用说明

目录 引脚有哪些功能如何选择功能代码 引脚有哪些功能 数据手册中&#xff0c;每一个引脚功能有至多64个&#xff0c;对应列Func0~Func63 其中&#xff0c;Func0 ~Func31在《表 2-1 引脚功能表》中列出 Func32~Func63在《表 2-2 Func32~63 表》中列出。 Func32~Func63中的功…

数据库管理-第293期 奇怪的sys.user$授权+(20250210)

数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09;1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权&#xff08;20250210&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09…

AutoMQ 如何实现没有写性能劣化的极致冷读效率

前言 追赶读&#xff08;Catch-up Read&#xff0c;冷读&#xff09;是消息和流系统常见和重要的场景。 削峰填谷&#xff1a;对于消息来说&#xff0c;消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住&#xff0c;让下游在容量范围内消费…

【大模型】本地部署DeepSeek-R1:8b大模型及搭建Open-WebUI交互页面

本地部署DeepSeek-R1:8b大模型 一、摘要及版本选择说明1.1 摘要1.2 版本选择 二、下载并安装Ollama三、运行DeepSeek-R1:8b大模型四、安装Open WebUI增强交互体验五、关闭Ollama开机自动启动六、DeepSeek大模型启停步骤 一、摘要及版本选择说明 1.1 摘要 作为一名对 AI 和生成…

DeepSeek大模型的发展的十问十答

DeepSeek大模型是由杭州深度求索人工智能基础技术研究有限公司开发的一款基于Transformer架构的大型语言模型&#xff0c;具体介绍如下&#xff1a; 1. 架构基础 Transformer架构&#xff1a;DeepSeek大模型基于Transformer架构&#xff0c;该架构由Google在2017年提出&#xf…

Avnet RFSoC基于maltab得5G 毫米波 开发工具箱

使用 MATLAB 连接到 AMD Zynq™ RFSoC 评估板。使用 RF 附加卡执行 OTA 测试。使用 HDL Coder 部署算法 版本要求&#xff1a; 大于 2023b 需要以下支持包之一&#xff1a; 适用于 Xilinx 基于 Zynq 的无线电&#xff08;R2023b 及更早版本&#xff09;的通信工具箱支持包适…

计算机毕业设计Python+Spark知识图谱医生推荐系统 医生门诊预测系统 医生数据分析 医生可视化 医疗数据分析 医生爬虫 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Vue事件处理 - 绑定事件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue事件处理 - 绑定事件及事件处理 目录 事件处理 绑定方式 函数表达式 绑定函数名 输入框绑定事件 拿到输入框的值 传值加事件源 事件第三种写法 总结 事件处理 绑定方式 函数表达式 在按钮上使用函数表达式绑定事…

World of Warcraft [CLASSIC] 80 Four Horsemen (Naxxramas)

纳克萨玛斯 天启四骑士 Four Horsemen 图一&#xff1a;10人同生共死 图二&#xff1a;25人同生共死站位 图三&#xff0c;不做同生共死&#xff0c;做永恒者&#xff0c;击杀白马分布图&#xff0c;主要是不熟练乱跑&#xff0c;容易导致减员失败 永恒者&#xff0c;玩家无一…

DeepSeek与AI提示语设计的全面指南

当人人都会用AI时&#xff0c;你如何用得更好更出彩&#xff1f;本文全面介绍了DeepSeek的功能与使用方法&#xff0c;并深入探讨了AI提示语设计的核心技巧与进阶策略。通过精准的任务定义、提示语优化和人机协作&#xff0c;用户可以从AI的基础使用逐步进阶到创新应用&#xf…

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…

TCP/IP 协议图解 | TCP 协议详解 | IP 协议详解

注&#xff1a;本文为 “TCP/IP 协议” 相关文章合辑。 未整理去重。 TCP/IP 协议图解 退休的汤姆 于 2021-07-01 16:14:25 发布 TCP/IP 协议简介 TCP/IP 协议包含了一系列的协议&#xff0c;也叫 TCP/IP 协议族&#xff08;TCP/IP Protocol Suite&#xff0c;或 TCP/IP Pr…

【C++11】lambda和包装器

1.新的类功能 1.1默认的移动构造和移动赋值 原来C类中&#xff0c;有6个默认成员函数&#xff1a;构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重 载/const 取地址重载&#xff0c;最后重要的是前4个&#xff0c;后两个⽤处不⼤&#xff0c;默认成员函数就是我们不写…

zabbix监控nginx指标

使用nginx作为web服务器&#xff0c;我们需要清晰知道&#xff1a; 1.nginx的工作状态 2.请求数有多少&#xff0c;多少是已经响应完成的&#xff0c;多少是响应失败的 3.nginx服务以及端口监听情况是否处于运行状态 当出现服务停止或者大量请求响应失败时&#xff0c;我们需要…