Java 虚拟机(JVM)生成3个关键文件,这些文件对于JVM优化性能和解决生产问题很是有用。这些文件是:java
在本文中,让咱们尝试理解这三个关键文件,在哪里使用它们,它们看起来如何,如何捕获它们,如何分析它们和它们的差别是什么。算法
GC 日志包含垃圾收集事件的相关信息。它将指示运行了多少 GC 事件、它们是什么类型的 GC 事件(即 Young GC 或 Full GC)、每一个 GC 事件暂停应用程序的时间、每一个 GC 事件回收了多少对象。app
能够在这里找到一个垃圾收集日志文件示例:jvm
日志示例ide
垃圾收集日志用于研究应用程序的 GC 和内存性能。它用于优化 GC 暂停时间,用于肯定应用程序的最佳内存大小,还用于排除与内存相关的问题工具
您能够经过传递如下 JVM 参数来生成垃圾收集日志:
对于 Java8:性能
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
从9开始的 Java 版本:优化
-Xlog:gc*:file=<file-path>
File-path: 是将要写入垃圾收集日志文件的位置。线程
垃圾收集日志的格式因 JVM 供应商的不一样而不一样(Oracle、 HP、 IBM、....,Java version (1.5,5,6,7,8,9,10,11,12,...) ,垃圾收集算法(Serial,Parallel,CMS,G1....和 JVM 各类参数。所以,没有一种可用的标准格式.不过这里有一个教程能够帮助你理解GC日志:link日志
有多个垃圾收集日志分析工具。这里给出一些流行的例子: GCeasy,IBM GC & Memory visualizer,HP JMeter,Google Garbage Cat。
线程转储是应用程序中在某个时间点上运行的全部线程的快照。它包含应用程序中每一个线程的全部信息,例如: 线程状态、线程 Id、本机 Id、线程名称、堆栈跟踪、优先级。
示例线程转储文件能够在这里找到:
线程转储文件主要用于排除生产问题,例如 CPU 峰值、应用程序中的无响应性、响应时间差、线程挂起、高内存消耗。
使用线程转储最多见的选择是使用“ jstack”工具。Jstack 工具是在 JDK_home\bin 文件夹中提供的。命令:
jstack -l <pid> > <file-path>
其中 pid: 是应用程序的进程 Id,应该捕获其线程转储,file-path: 是将线程转储写入的文件路径。
如下是使用最普遍的线程转储分析工具: fastThread
、 Samurai
、 IBM Thread & Monitor analyzer
、 Visual VM
堆转储是应用程序内存在某个时间点上的快照。它包含诸如内存中的对象是什么,它们携带什么值,它们的大小是什么,它们引用什么其余对象等信息。
这里能够找到一个示例堆转储。示例文件
(注意: 它将是二进制格式的。因此你实际上不能阅读它)
堆转储主要用于排除与内存有关的 OutOfMemoryError 问题
使用堆转储最多见的选择是使用“ jmap”工具。Jmap 工具是在 JDK_home\bin 文件夹中提供的
jmap -dump:format=b,file=<file-path> [pid] 其中 pid: 是 Java 进程 Id ,file-path: 是将堆转储写入的文件路径。
堆转储文件采用二进制格式,而且大小每每很大。除此以外,他们的格式严重缺少文档。所以,您必须使用堆转储分析工具,最普遍的堆转储分析工具备: Eclipse MAT、 HeapHero 和 JVisualVM。
关注公众号:java宝典