简易指南:获取JMap内存dump的多种方法
最编程
2024-02-10 15:26:34
...
java获取内存dump的几种方式
java获取内存dump的几种方式
获取内存详情:jmap -dump:format=b,file=e.bin pid
这种方式可以用 jvisualvm.exe 进行内存分析,或者采用 Eclipse Memory Analysis Tools (MAT)这个工具
获取内存dump: jmap -histo:live pid
这种方式会先出发fullgc,所有如果不希望触发fullgc 可以使用jmap -histo pid
第三种方式:jdk启动加参数:
-XX:+HeapDumpBeforeFullGC
-XX:HeapDumpPath=/httx/logs/dump
这种方式会产生dump日志,再通过jvisualvm.exe 或者Eclipse Memory Analysis Tools 工具进行分析
jmap
1)查看堆内存信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况,可以结合jhat使用
2)主要用于分析OOM
用法:
jmap -heap <PID>
jmap -dump:format=b,file=HeapDump <pid> #dump出内存信息,可用内存分析工具分析情况,format=b是通过二进制的意思
例如:
[root@lsy-36-70 ~]# jmap -heap 7574 Attaching to process ID 7574, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.211-b12 using thread-local object allocation. Parallel GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 3183476736 (3036.0MB) NewSize = 66060288 (63.0MB) MaxNewSize = 1061158912 (1012.0MB) OldSize = 133169152 (127.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 = 562561024 (536.5MB) used = 386173616 (368.2838592529297MB) free = 176387408 (168.2161407470703MB) 68.64564012170172% used From Space: capacity = 1048576 (1.0MB) used = 720896 (0.6875MB) free = 327680 (0.3125MB) 68.75% used To Space: capacity = 14155776 (13.5MB) used = 0 (0.0MB) free = 14155776 (13.5MB) 0.0% used PS Old Generation capacity = 108003328 (103.0MB) used = 27321200 (26.055526733398438MB) free = 80682128 (76.94447326660156MB) 25.296627896503338% used 16408 interned Strings occupying 1561208 bytes.
2)dump出堆内存信息到文件
[root@lsy-36-70 ~]# jmap -dump:format=b,file=/tmp/dump01.dat 7574 Dumping heap to /tmp/dump01.dat ... Heap dump file created
或者
[root@lsy-36-70 ~]# jmap -dump:format=b,file=/tmp/dump01.dump 7574
Dumping heap to /tmp/dump01.dump ...
Heap dump file created
3)jhat查看,浏览器输入7000端口访问
[root@lsy-36-70 ~]# jhat -port 7000 /tmp/dump01.dat
或者
[root@lsy-36-70 ~]# jhat -port 7000 /tmp/dump01.dump
推荐阅读
-
简易讲解:获取PHP目录中所有文件和子目录的多种实用方法(精选)
-
简易理解:试用三种内存检测工具的方法指南
-
简易指南:Linux系统下安装软件的多种方法
-
简易指南:获取JMap内存dump的多种方法
-
理解与剖析Java内存状况:jmap、jhat与内存转储dump的工具应用指南
-
简易理解的jmap内存分析工具指南
-
修正JMap获取堆内存使用统计信息时报出的错误方法
-
实用的命令行工具指南:深入理解jps、jstack、jmap、jhat、jstat与hprof JVM 性能优化与监控方法" - jps: Java虚拟机进程状态工具 - 全面解读 - jstack: 一步步掌握堆栈跟踪工具 - 实战解析 - jmap & jhat: 内存映射与Java堆分析利器 - 详解篇 - jstat: JVM性能统计与监测工具 - 使用详解 - hprof: 堆/CPU性能剖析工具 - 深入学习指南
-
玩转Java底层:JMX详解 - jconsole与自定义MBean监控工具的实际应用与区别" 在日常JVM调优中,我们熟知的jconsole工具通过JMX包装的bean以图形化形式展示管理数据,而像jstat和jmap这类内建监控工具则由JVM直接支持。本文将以jconsole为例,深入讲解其实质——基于JMX的MBean功能,包括可视化界面上的bean属性查看和操作调用。 MBeans在jconsole中的体现是那些可观察的组件属性和方法,如上图所示,通过名为"Verbose"的属性能看到其值为false,同时还能直接操作该bean的方法,例如"closeJerryMBean"。 尽管jconsole给我们提供了直观的可视化界面,但请注意,这里的MBean并非固定不变,开发者可根据JMX提供的接口将自己的自定义bean展示到jconsole。以下步骤展示了如何创建并注册一个名为"StudyJavaMBean"的自定义MBean: 1. 首先定义接口`StudyJavaMBean`,接口需遵循MBean规范,即后缀为"MBean"且包含getter方法代表属性,如`getApplicationName`,和无返回值的setter方法代表操作,如`closeJerryMBean`。 ```java public interface StudyJavaMBean { String getApplicationName(); void closeJerryMBean(); } ``` 2. 编写接口的实现类`StudyJavaMBeanImpl`,实现接口中的方法: ```java public class StudyJavaMBeanImpl implements StudyJavaMBean { @Override public String getApplicationName() { return "每天学Java"; } @Override public void closeJerryMBean() { System.out.println("关闭Jerry应用"); } } ``` 3. 在代码中注册自定义MBean,涉及的关键步骤包括: - 获取平台MBeanServer - 定义ObjectName,指定唯一的MBean标识符 - 注册MBean到服务器 - 启动RMI连接器服务,以便jconsole能够访问 ```java public void registerMBean() throws Exception { // ... 具体实现省略 ... } ``` 实际运行注册后的MBean,您将在jconsole中发现并查看自定义bean的属性和调用相关方法。然而,这种方式相较于传统的属性/日志查看和HTTP接口,实用性相对有限,可能存在潜在的安全风险。但不可否认的是,JMX及其MBean机制对于获取操作系统信息、内存状态等关键性能指标仍然具有重要价值。例如: 1. **获取操作系统信息**:通过JMX MBean,可以直接获取到诸如CPU使用率、操作系统版本等系统级信息,这对于资源管理和优化工作具有显著帮助。