QQA: jstat gcutil 的輸出是什麼意思
當 Java 程式有效能問題時,尤其是響應時間有突然變化時,最好第一時間檢視 GC 的狀態。一般用 jstat -gcutil <pid> 1s
來檢視,那麼它的輸出又是什麼含義呢?
一般會用兩種方式呼叫 jstat
,一種看百分比,一種看具體數值(KB)。
例如 jstat -gcutil <pid> 1s
會每隔一秒輸出記憶體相關資訊,示例輸出如下:
S0S1EOMCCSYGCYGCTFGCFGCTGCT 0.000.0034.4744.2993.0583.49100.03620.1170.153 0.000.0045.7044.2993.0583.49100.03620.1170.153 0.000.0058.1244.2993.0583.49100.03620.1170.153
而 jstat -gc <pid> 1s
會輸出具體佔用的數值,如下(比較長):
S0CS1CS0US1UECEUOCOUMCMUYGCYGCTFGCFGCTGCT 4608.0 6656.00.00.062464.048011.430720.013605.835456.0 32991.3 100.03620.1170.153 4608.0 6656.00.00.062464.049261.530720.013605.835456.0 32991.3 100.03620.1170.153 4608.0 6656.00.00.062464.049261.530720.013605.835456.0 32991.3 100.03620.1170.153
要理解上面輸出的具體含義,需要了解 Java 的記憶體與 GC 的過程。
下圖是 GC 過程的概要(圖片來源 ofollow,noindex">plumbr.io ):
如上圖,JVM 中的記憶體中的各個區域和作用如下(這裡只是概述,細節麻煩查閱相關材料):
-
Eden
(伊甸園):建立新物件時會從中分配記憶體。記憶體不足時,觸發 Young GC。不再被引用的物件將被拋棄,還被引用的物件會被複制到 Survivor 區。 -
Survivor
(倖存者):有兩個 Survivor 區,GC 時會來回地把記憶體從其中一個區複製到另一個,交替進行。這裡儲存的是一些“年輕”的物件,多次 GC (預設 15 次)後這些物件還停留在 Survivor 區,則認為它們會被長期引用,Survivor 空間不足時會將它們移動到“老生代”中。來回複製的過程中除了釋放記憶體,還起到整理記憶體碎片的作用。 -
Tenured
(終生代)、也稱Old Generation
(老生代):保留那些“長期”被引用的物件。因此該區域只在 Full GC 的時候才會被整理。 -
PermGen
/MetaSpace
,Java 8 前是 PermGen,Java 8 後改成 MetaSpace。用來儲存諸如載入的類、字串常量等元資訊,與 GC 無關。
另外: Eden
與 Survivor
統稱“年輕代”,它們引發的 GC 也稱 “Young GC”。Young GC 通常比 Full GC 快很多,如果系統有卡頓,一般需要關注 Full GC。
瞭解了 GC 的過程,其實 jstat
的輸出通過查文件 man jstat
就可以找到。這裡權且作個翻譯:
-gcutil
的輸出如下
Column | Description |
---|---|
S0 | 第 0 個 survivor(倖存區)使用的百分比 |
S1 | 第 1 個 survivor(倖存區)使用的百分比 |
E | Eden 區使用記憶體的百分比 |
O | 老生代記憶體使用的百分比 |
P/M | PermGen / MetaSpace 的記憶體使用百分比 |
YGC | 程式啟動以來 Young GC 發生的次數 |
YGCT | 程式啟動以來 Young GC 共消耗的時間(s) |
FGC | 程式啟動以來 Full GC 發生的次數 |
FGCT | 程式啟動以來 Young GC 共消耗的時間(s) |
GCT | 程式啟動以來 GC 的總用時(s) |
-gc
的輸出如下
Column | Description |
---|---|
SOC | 第 0 個 Survivor 區的總空間 (KB). |
S1C | 第 1 個 Survivor 區的總空間 (KB). |
S0U | 第 0 個 Survivor 區已使用的空間 (KB). |
S1U | 第 1 個 Survivor 區已使用的空間 (KB). |
EC | Eden 區的總空間 (KB). |
EU | Eden 區已使用的空間 (KB). |
OC | OldGen 的總空間 (KB). |
OU | OldGen 已使用的空間 (KB). |
PC/MC | PermGen / MetaSpace 的總空間 (KB). |
PU/MU | PermGen / MetaSpace 使用的空間 (KB). |
YGC | 程式啟動以來 Young GC 發生的次數 |
YGCT | 程式啟動以來 Young GC 共消耗的時間(s) |
FGC | 程式啟動以來 Full GC 發生的次數 |
FGCT | 程式啟動以來 Young GC 共消耗的時間(s) |
GCT | 程式啟動以來 GC 的總用時(s) |