Java 虛擬機(jī) (JVM) 生成 3 個(gè)關(guān)鍵組件,這些組件對(duì)于優(yōu)化性能和排除生產(chǎn)問(wèn)題很有用。這些組件是:
- 垃圾收集 (GC) 日志
- 線程轉(zhuǎn)儲(chǔ)
- 堆轉(zhuǎn)儲(chǔ)
在本文中,讓我們嘗試了解這 3 個(gè)關(guān)鍵組件,它們?cè)谀睦锸褂?,它的外觀如何,如何捕獲它們,如何分析它們以及它們的差異。
1.垃圾收集日志
a) 什么是 GC 日志?
GC Log 包含垃圾收集事件相關(guān)信息。它將指示運(yùn)行了多少 GC 事件,它們是什么類型的 GC 事件(即 Young GC 或 Full GC),每個(gè) GC 事件暫停應(yīng)用程序的時(shí)間,每個(gè) GC 事件回收了多少對(duì)象。
b) GC 日志看起來(lái)如何?
可以在此處找到示例垃圾收集日志文件。
c) GC Log 在哪里使用?
垃圾收集日志用于研究應(yīng)用程序的 GC 和內(nèi)存性能。它用于優(yōu)化 GC 暫停時(shí)間,用于確定應(yīng)用程序的最佳內(nèi)存大小,還用于解決與內(nèi)存相關(guān)的問(wèn)題。
d) 如何生成GC日志?
您可以通過(guò)傳遞以下 JVM 參數(shù)來(lái)生成垃圾收集日志:
對(duì)于 8 之前的 Java 版本:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:<file-path>
對(duì)于從 9 開(kāi)始的 Java 版本:
-Xlog:gc*:file=<file-path>
文件路徑:是垃圾收集日志文件將被寫(xiě)入的位置。
e) 如何理解GC Log?
垃圾收集日志格式因您的 JVM 供應(yīng)商(Oracle、HP、IBM、Azul 等)、Java 版本(1.5、5、6、7、8、9、10、11、12……)、垃圾而異收集算法(串行、并行、CMS、G1、Shenandoah、Z GC)和傳遞的 JVM 參數(shù)。因此,沒(méi)有一種可用的標(biāo)準(zhǔn)化格式。
f) 使用什么工具來(lái)分析 GC 日志?
有多種垃圾收集日志分析工具。這里給出了一些流行的:GCeasy、IBM GC 和內(nèi)存可視化器、HP JMeter、Google Garbage Cat。
2.線程轉(zhuǎn)儲(chǔ)
a) 什么是線程轉(zhuǎn)儲(chǔ)?
線程轉(zhuǎn)儲(chǔ)是某個(gè)時(shí)間點(diǎn)在應(yīng)用程序中運(yùn)行的所有線程的快照。它包含有關(guān)應(yīng)用程序中每個(gè)線程的所有信息,例如:線程狀態(tài)、線程 ID、本機(jī) ID、線程名稱、堆棧跟蹤、優(yōu)先級(jí)。
b) 線程轉(zhuǎn)儲(chǔ)看起來(lái)如何?
可以在此處找到示例線程轉(zhuǎn)儲(chǔ)。
c) 線程轉(zhuǎn)儲(chǔ)在哪里使用?
線程轉(zhuǎn)儲(chǔ)主要用于解決生產(chǎn)問(wèn)題,例如 CPU 峰值、應(yīng)用程序無(wú)響應(yīng)、響應(yīng)時(shí)間差、線程掛起、內(nèi)存消耗高。
d) 如何生成線程轉(zhuǎn)儲(chǔ)?
可以使用8 個(gè)不同的選項(xiàng)從正在運(yùn)行的應(yīng)用程序中捕獲線程轉(zhuǎn)儲(chǔ)。進(jìn)行線程轉(zhuǎn)儲(chǔ)的最常見(jiàn)選項(xiàng)是使用“jstack”工具。jstack 工具在 JDK_HOME\bin 文件夾中提供。這是您需要發(fā)出以捕獲線程轉(zhuǎn)儲(chǔ)的命令:
jstack -l <pid> > <file-path>
其中pid:是應(yīng)用程序的進(jìn)程ID,應(yīng)捕獲其線程轉(zhuǎn)儲(chǔ),而file-path:是將寫(xiě)入線程轉(zhuǎn)儲(chǔ)的文件路徑。
e) 使用什么工具來(lái)分析線程轉(zhuǎn)儲(chǔ)?
以下是使用最廣泛的線程轉(zhuǎn)儲(chǔ)分析工具:?fastThread
?、?Samurai
?、?IBM Thread & Monitor Analyzer
?、?Visual VM
?。
3.堆轉(zhuǎn)儲(chǔ)
a) 什么是堆轉(zhuǎn)儲(chǔ)?
堆轉(zhuǎn)儲(chǔ)是某個(gè)時(shí)間點(diǎn)應(yīng)用程序內(nèi)存的快照。它包含諸如內(nèi)存中的對(duì)象是什么、它們攜帶什么值、它們的大小是多少、它們引用了哪些其他對(duì)象等信息。
b) 堆轉(zhuǎn)儲(chǔ)看起來(lái)如何?
可以在此處找到示例堆轉(zhuǎn)儲(chǔ)。(注意:它將采用二進(jìn)制格式。因此您實(shí)際上無(wú)法讀取它)。
c) 堆轉(zhuǎn)儲(chǔ)在哪里使用?
堆轉(zhuǎn)儲(chǔ)主要用于解決內(nèi)存相關(guān)的 OutOfMemoryError 問(wèn)題。
d) 如何生成堆轉(zhuǎn)儲(chǔ)?
可以使用7 個(gè)不同的選項(xiàng)從正在運(yùn)行的應(yīng)用程序中捕獲堆轉(zhuǎn)儲(chǔ)。進(jìn)行堆轉(zhuǎn)儲(chǔ)的最常見(jiàn)選項(xiàng)是使用“jmap”工具。jmap 工具在 JDK_HOME\bin 文件夾中提供。這是您需要發(fā)出以捕獲的命令:
<span style="font-weight: 400;">jmap -dump:format=b,</span><span style="font-weight: 400;">
</span><span style="font-weight: 400;">file=<file-path> <pid> </span>
其中pid:是 Java 進(jìn)程 ID,應(yīng)捕獲其堆轉(zhuǎn)儲(chǔ),而file-path:是將寫(xiě)入堆轉(zhuǎn)儲(chǔ)的文件路徑。
e) 如何理解堆轉(zhuǎn)儲(chǔ)?
堆轉(zhuǎn)儲(chǔ)文件采用二進(jìn)制格式,并且往往很大。除此之外,它們的格式嚴(yán)重缺乏文檔。因此,您必須使用堆轉(zhuǎn)儲(chǔ)分析工具(在下一個(gè)問(wèn)題中給出)來(lái)分析和理解它們。
f) 使用什么工具來(lái)分析 Heap dump?
以下是使用最廣泛的堆轉(zhuǎn)儲(chǔ)分析工具:?Eclipse MAT
?、?HeapHero
?、?JVisualVM
?。