Java基础 - JVM之Dump文件详解
学习Jvm调优,我们会接触到Dump文件。什么是Dump文件、Dump文件是如何得到的。当程序崩溃时,如何从Dump文件还原崩溃时的信息。本文讲重点讲解。
一、什么是Dump
Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一个点状态的thread-dump的能力,虽然各个Java虚拟机打印的thread dump稍有不同,但是大部分提供了当前活动线程的快照及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能还有源码的行数。
三、为什么需要Dump
服务器CPU,内存占用空间飙升,或者GC频繁,首先需要排除的就是内存泄露,即内存中没有的对象的空间没有被及时回收导致的。而检测内存泄露就需要看哪种类在内存占了较多份额,从而定位到代码,然后修改。
分析思路
- CPU、MEM飙升,确定是否WEB服务的问题并记录PID
- 查看GC情况,如果每次GC效果不明显说明内存泄露
- 导出Dump并分析,定位占用top n的类
- 分析并找到 哪里创建的类占用了大量
四、Dump记录哪些内容
4.1 Java dump 文件的格式和内容
Java dump通常的文本格式(.txt), 因此可用通过一般的文本编辑器进行阅读,阅读时需要注意段与行的格式:
-
段格式
为了方便分析,Java dump的每一段的开头,都会有“----”与上一段明显的区分开来,而每一段的标题也会用“====”作为标识,这样我们能非常方便的找到开头及其标题部分
清单1:JAVA dump标题示例
NULL --------------------------------
0SECTION TITLE subcomponent dump routine
NULL =============================== -
行格式
Java dump 文件中,每一行都包含一个标签,这个标签最多由 15 个字符组成(如清单2中所示)。其中第一位数字代表信息的详细级别(0,1,2,3,4),级别越高代表信息越详细;接下来的两个字符是段标题的缩写,比如,“CI” 代表 “Command-line interpreter”,“CL” 代表 “Class loader”,“LK” 代表 “Locking”,“ST” 代表 “Storage”,“TI” 代表 “Title”,“XE” 代表 “Execution engine”等等;其余部分为信息的概述。
1TISIGINFO Dump Event “uncaught” (00008000) Detail “java/lang/OutOfMemoryError” received
不同版本的 JVM 所产生的 Java dump 的格式可能会稍有不同,但基本上都会包含以下几个方面的内容:
- TITLE 信息块:描述 JAVA DUMP 产生的原因,时间以及文件的路径
- GPINFO信息块:GPF 信息。
- ENVINFO 信息块:系统运行时的环境及 JVM 启动参数。
- MEMINFO 信息块:内存的使用情况和垃圾回收记录。
- LOCKS 信息块:用户监视器(Monitor)和系统监视器(Monitor)。
- THREADS信息块:所有 java 线程的状态信息和执行堆栈。
- CLASSES信息块:类加载信息。
4.2 常用分类heap dump和thread dump
-
heap dump
heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
-
thread dump
thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。
两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。
五、如何生产Dump文件
使用的JDK工具在JDK_HOME/bin/目录下,使用到jmap和jstack这两个命令。
5.1 获取heap dump文件
windows下切换到JDK_HOME/bin/,执行以下命令:jmap -dump:format=b,file=heap.hprof 2576
linux下切换到JDK_HOME/bin/,执行以下命令:./jmap -dump:format=b,file=heap.hprof 2576
这样就会在当前目录下生成heap.hprof文件,这就是heap dump文件。
5.2 获取heap dump文件
windows下执行:jstack 2576 > thread.txt
inux下执行:./jstack 2576 > thread.txt
windows/linux则会将命令执行结果转储到thread.txt,这就是thread dump文件。有了dump文件后,我们就能借助性能分析工具获取dump文件中的信息。
5.3 如果我们只需要将dump中存活的对象导出,那么可以使用:live参数
jmap -dump:live,format=b,file=heapLive.hprof 2576
5.4 自动生成dump文件
-
-XX:+HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件。这是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。
-
-XX:+HeapDumpBeforeFullGC
当 JVM 执行 FullGC 前执行 dump
-
-XX:+HeapDumpAfterFullGC
当 JVM 执行 FullGC 后执行 dump。
-
-XX:+HeapDumpOnCtrlBreak
交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。
-
-XX:HeapDumpPath=d:\dump.hprof
指定 dump 文件存储路径。注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
六、Dump文件查看工具
定位排查问题时最为常⽤命令包括:jps(进程)、jmap(内存)、jstack(线程)、jinfo(参数)等。文章来源:https://www.toymoban.com/news/detail-647297.html
- jps:查询当前机器所有Java进程信息
- jmap:输出某个 Java 进程内存情况
- jstack:打印某个 Java 线程的线程栈信息
- jinfo:用于查看jvm
JDK命令
-
jconsole 监控界面
-
jvisualvm
-
阿里检测命令工具Arthas
-
Eclipse内存分析工具MAT(MemoryAnalyzerTool)
-
Jprofiler
七、总结
如果某种类型的对象太多,那么有可能是引用它的那个类的对象太多;基本上一些简单页面的查询,结合原代码,就可以初步定位内存泄漏的地方;综上,dump文件结构还是比较简单的,这对于分析线程的执行情况非常有用,也是每一个Java程序员必须掌握的高级技能之一;文章来源地址https://www.toymoban.com/news/detail-647297.html
到了这里,关于【Java基础】- JVM之Dump文件详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!