拓展阅读
JVM FULL GC 生产问题 I-多线程通用实现
JVM FULL GC 生产问题 II-如何定位内存泄露? 线程通用实现
JVM FULL GC 生产问题 III-多线程执行队列的封装实现,进一步抽象
jvm-44-jvm 内存性能分析工具 Eclipse Memory Analyzer Tool (MAT) / 内存分析器 (MAT)
jvm-45-jvm dump 文件内存介绍+获取方式+堆内存可视分析化工具
jvm-46-jvm Thread Dump 线程的堆栈跟踪信息+获取方式+可视分析化工具 FastThread
jvm-47-jvm GC 垃圾回收日志+获取方式+可视分析化工具 gcviewer
jvisualvm java 性能分析工具
jvm dump 文件是什么?
JVM内存Dump是指在Java虚拟机运行时,将其内存状态(堆、栈等信息)写入到磁盘文件中的操作。
内存Dump文件通常用于故障排查、性能分析和诊断。
当JVM出现崩溃、内存泄漏或严重的性能瓶颈时,生成内存Dump文件可以帮助开发人员进一步分析内存状态,找出根本原因。
内存 Dump 文件类型
JVM提供了几种常见的内存Dump文件类型:
Heap Dump:包含JVM堆的所有对象及其状态,适用于分析内存泄漏和分析堆中对象的分布。它可以通过工具如
jhat
、VisualVM
、Eclipse MAT
等来分析。Thread Dump:包含所有线程的堆栈跟踪信息,适用于分析死锁、线程阻塞或性能瓶颈。可以通过
jstack
命令生成。Core Dump:包含JVM的核心内存状态,通常用于分析JVM崩溃时的堆栈信息。
如何获得?
Heap Dump记录了JVM堆内存的详细信息,包括对象的实例、大小、引用关系、类加载信息等。
Heap Dump通常用于分析内存泄漏、对象分配情况等问题。
生成Heap Dump的方式有几种:
启动参数
JVM启动时配置:通过启动参数来配置JVM在出现
OutOfMemoryError
时自动生成Heap Dump。java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof -jar app.jar
这会在出现内存溢出时生成Heap Dump文件。
jvm 参数解释
下面是对java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof -jar app.jar
命令中各个参数的解释,以表格形式展示:
参数 | 含义 |
---|---|
-XX:+HeapDumpOnOutOfMemoryError | 启用在发生OutOfMemoryError 时自动生成Heap Dump文件。该参数在JVM内存溢出时非常有用,可以帮助开发者分析内存泄漏问题。 |
-XX:HeapDumpPath=/path/to/dump.hprof | 指定Heap Dump文件的保存路径。文件的扩展名通常是.hprof ,这是Heap Dump的标准格式。路径可以是绝对路径或相对路径,确保目标目录存在并具有写权限。 |
-jar app.jar | 启动指定的Java应用程序,其中app.jar 是应用程序的JAR文件。这个参数告诉JVM运行一个JAR文件,替代了普通的-cp (classpath)方式。 |
这些参数组合在一起,确保在OutOfMemoryError
发生时,JVM会自动生成堆内存Dump,并将其保存到指定路径。
命令
通过JVM命令行工具:可以使用
jmap
工具手动生成Heap Dump文件:jmap -dump:live,format=b,file=/path/to/dump.hprof <pid>
其中,
<pid>
是目标JVM进程的PID,live
表示只导出存活对象,format=b
表示使用二进制格式,file
指定文件输出路径。通过JVM信号:在Linux或Mac上,发送
SIGQUIT
信号(例如使用Ctrl+\
)也可以生成Heap Dump。
一般实际中主要用第一种 jmap 的方式。
如何分析?可视化工具
这些 dump 文件靠人眼看,不太现实。
下面是一些常见的分析工具,个人比较喜欢 MAT 工具。
工具 | 特点 | 适用场景 |
---|---|---|
Eclipse MAT | 强大的内存泄漏检测,支持Dominator树、引用链分析,报告生成 | 深入分析Heap Dump,找出内存泄漏和性能瓶颈。 |
VisualVM | 集成JVM监控,支持Heap Dump分析,实时性能监控,插件扩展 | 实时监控和分析Java应用,适用于日常性能分析和内存分析。 |
JProfiler | 强大的内存、CPU、线程分析,内存泄漏检测,性能瓶颈分析,商业工具 | 适用于复杂的Java应用,帮助深入分析内存泄漏和性能瓶颈。 |
YourKit | 高度可定制的性能分析工具,内存、CPU、线程分析,支持Heap Dump分析,商业工具 | 性能优化和内存分析,适合大型和复杂的Java应用,支持实时性能监控。 |
jhat | 轻量级工具,JDK自带,简单Web界面,适用于基本的Heap Dump分析 | 用于快速查看Heap Dump,适合轻量级分析,不适合复杂的内存分析需求。 |
小结
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次相遇。