Java 虛擬機 (JVM) 生成 3 個關鍵工件,可用於優化性能和解決生產問題。 這些工件是:

  1. 垃圾收集 (GC) 日誌
  2. 線程轉儲
  3. 堆轉儲

1.垃圾收集日誌

a) 什麼是 GC 日誌?

GC Log 包含垃圾收集事件相關信息。 它將指示運行了多少 GC 事件,該命令是什麼類型的 GC 事件命令(即年輕 GC 或 Full GC),每個 GC 事件暫停應用程序多長時間,每個 GC 事件回收了多少對象。

b) GC 日誌是什麼樣的?

可以在此處找到示例垃圾收集日誌文件。

c) GC 日誌在哪裡使用?

垃圾收集日誌用於研究應用程序的 GC 和內存性能。 它用於優化 GC 暫停時間,用於確定應用程序的最佳內存大小,還用於解決與內存相關的問題。

d) 如何生成 GC 日誌?

您可以通過傳遞以下 JVM 參數來生成垃圾收集日誌:

在 Java 版本 8 之前:

從 9 開始的 Java 版本:

file-path:是垃圾收集日誌文件將被寫入的位置。

e) 如何理解 GC 日誌?

垃圾收集日誌格式取決於您的 JVM 供應商(Oracle、HP、IBM、Azul 等)、Java 版本(1.5、5、6、7、8、9、10、11、12、…)、垃圾收集算法(串行、並行、CMS、G1、Shenandoah、Z GC)和您傳遞的 JVM 參數。 因此,沒有一種可用的標準化格式。 但是這裡有一個視頻教程,它試圖幫助您了解 GC 日誌文件格式。

f) 使用什麼工具來分析 GC 日誌?

有多種垃圾收集日誌分析工具。 這裡給出了一些流行的:GCeasy、IBM GC & Memory Visualizer、HP JMeter、Google Garbage Cat

2.線程轉儲

a) 什麼是線程轉儲?

線程轉儲是在某個時間點在應用程序中運行的所有線程的快照。 它包含有關應用程序中每個線程的所有信息,例如線程狀態、線程 ID、本機 ID、線程名稱、堆棧跟踪和優先級。

b) 線程轉儲是什麼樣的?

可以在此處找到示例線程轉儲。

c) 線程轉儲在哪裡使用?

線程轉儲主要用於解決生產問題,例如 CPU 峰值、應用程序無響應、響應時間差、線程掛起、內存消耗高。

d) 如何生成線程轉儲?

可以使用 8 個不同的選項從正在運行的應用程序中捕獲線程轉儲。 進行線程轉儲的最常見選項是使用“jstack”工具。 jstack 工具包含在 JDK_HOMEbin 文件夾中。 這是您需要發出以捕獲線程轉儲的命令:

pid:是應用程序的進程ID,應捕獲其線程轉儲

file-path:是寫入線程轉儲的文件路徑。

e) 如何理解線程轉儲?

這是一個視頻演講,它提供了有關如何理解線程轉儲的詳細概述。

f) 使用什麼工具來分析線程轉儲?

以下是使用最廣泛的線程轉儲分析工具:fastThread、Samurai、IBM Thread & Monitor 分析器、Visual VM

3.堆轉儲

a) 什麼是堆轉儲?

堆轉儲是應用程序在某個時間點內存的快照。 它包含諸如內存中的對像是什麼、它們攜帶什麼值、它們的大小是多少、它們引用了哪些其他對像等信息。

b) 堆轉儲是什麼樣的?

可以在此處找到示例堆轉儲。 (注意:它將是二進制格式。所以你實際上無法閱讀它)。

c) 堆轉儲在哪裡使用?

堆轉儲主要用於解決與內存相關的 OutOfMemoryError 問題。

d) 如何生成堆轉儲?

可以使用 7 個不同的選項從正在運行的應用程序中捕獲堆轉儲。 進行堆轉儲的最常見選項是使用“jmap”工具。 jmap 工具包含在 JDK_HOMEbin 文件夾中。 這是您需要發出來捕獲的命令:

pid:是 Java 進程 ID,應捕獲其堆轉儲

文件路徑:是堆轉儲將被寫入的文件路徑。

e) 如何理解堆轉儲?

堆轉儲文件是二進制格式,並且往往很大。 除此之外,它們的格式嚴重缺乏文檔。 因此,您必須使用堆轉儲分析工具(在下一個問題中給出)來分析和理解它們。

f) 使用什麼工具來分析堆轉儲?

以下是使用最廣泛的堆轉儲分析工具:Eclipse MAT、HeapHero、JVisualVM。
我們希望這篇文章涵蓋瞭如何分析垃圾收集日誌、線程轉儲和堆轉儲的所有方法。 如果您發現本文對您真的有幫助,請與您的朋友、親戚、家人和其他人分享此信息。 在下一篇文章中見 signalfix.net