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寶典