node 网站开发,wordpress瀏覽器圖標,代写文章哪里找写手,做仿网站公司Java基础 - JVM之Dump文件详解 文章目录 Java基础 - JVM之Dump文件详解一、什么是Dump三、为什么需要Dump分析思路 四、Dump记录哪些内容4.1 Java dump 文件的格式和内容段格式行格式 4.2 常用分类heap dump和thread dumpheap dumpthread dump 五、如何生产Dump文件5.1 获取hea…Java基础 - JVM之Dump文件详解 文章目录 Java基础 - JVM之Dump文件详解一、什么是Dump三、为什么需要Dump分析思路 四、Dump记录哪些内容4.1 Java dump 文件的格式和内容段格式行格式 4.2 常用分类heap dump和thread dumpheap dumpthread dump 五、如何生产Dump文件5.1 获取heap dump文件5.2 获取heap dump文件5.3 如果我们只需要将dump中存活的对象导出那么可以使用:live参数5.4 自动生成dump文件 六、Dump文件查看工具JDK命令jconsole 监控界面 jvisualvm阿里检测命令工具ArthasEclipse内存分析工具MATMemoryAnalyzerToolJprofiler 七、总结 学习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的每一段的开头都会有“----”与上一段明显的区分开来而每一段的标题也会用“”作为标识这样我们能非常方便的找到开头及其标题部分 清单1JAVA dump标题示例 NULL -------------------------------- 0SECTION TITLE subcomponent dump routine NULL 行格式 Java dump 文件中每一行都包含一个标签这个标签最多由 15 个字符组成如清单2中所示。其中第一位数字代表信息的详细级别01234级别越高代表信息越详细接下来的两个字符是段标题的缩写比如“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:formatb,fileheap.hprof 2576
linux下切换到JDK_HOME/bin/执行以下命令./jmap -dump:formatb,fileheap.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,formatb,fileheapLive.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:HeapDumpPathd:\dump.hprof 指定 dump 文件存储路径。注意JVM 生成 Heap Dump 的时候虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
六、Dump文件查看工具
定位排查问题时最为常⽤命令包括jps进程、jmap内存、jstack线程、jinfo参数等。
jps查询当前机器所有Java进程信息jmap输出某个 Java 进程内存情况jstack打印某个 Java 线程的线程栈信息jinfo用于查看jvm
JDK命令 jconsole 监控界面 jvisualvm 阿里检测命令工具Arthas Eclipse内存分析工具MATMemoryAnalyzerTool Jprofiler
七、总结
如果某种类型的对象太多那么有可能是引用它的那个类的对象太多;基本上一些简单页面的查询结合原代码就可以初步定位内存泄漏的地方;综上dump文件结构还是比较简单的这对于分析线程的执行情况非常有用也是每一个Java程序员必须掌握的高级技能之一;