# 【JVM】jstat 教學

`jstat` 是 Java 提供的另一個工具，用於監控 Java 虛擬機（JVM）內存和垃圾回收狀況。這個工具對於監測和診斷 JVM 性能表現十分有用，特別是在優化內存使用和了解垃圾回收行為方面。以下是 `jstat` 的使用方式和一些常見的選項。

### 基本用法

`jstat` 的基本語法如下：

```lang-bash
jstat [option] <pid> [interval] [count]

```

- `option`：選擇要查看的統計信息類型。
- `pid`：要監控的 Java 進程的進程 ID（可以用 `jps` 查找）。
- `interval`（可選）：更新統計信息的間隔時間（以毫秒為單位）。
- `count`（可選）：輸出更新的次數。

### 常見選項

- `jstat -gc <pid>`：顯示 JVM 垃圾回收相關的統計信息。
    
    ```
    jstat -gc <pid> <span class="hljs-number">1000</span> <span class="hljs-number">5</span>
    
    ```
    
    這會每隔 1000 毫秒（1 秒）更新一次垃圾回收的數據，共更新 5 次。輸出內容包含各個垃圾回收區的大小、使用情況，以及 YGC（年輕代垃圾回收）和 FGC（老年代垃圾回收）的次數等。
    
    輸出示例：
    
    ```
    S0C    S1C    S0U    S1U      EC       EU       OC        OU       MC       MU       CCSC     CCSU      YGC    YGCT   FGC    FGCT     GCT   
    <span class="hljs-number">512.0</span>  <span class="hljs-number">512.0</span>   <span class="hljs-number">0.0</span>    <span class="hljs-number">0.0</span>   <span class="hljs-number">4352.0</span>   <span class="hljs-number">1234.0</span>   <span class="hljs-number">10240.0</span>   <span class="hljs-number">5678.0</span>   <span class="hljs-number">2560.0</span>   <span class="hljs-number">1900.5</span>   <span class="hljs-number">224.0</span>    <span class="hljs-number">150.0</span>       <span class="hljs-number">5</span>    <span class="hljs-number">0.345</span>    <span class="hljs-number">1</span>     <span class="hljs-number">0.654</span>    <span class="hljs-number">1.0</span>
    
    ```
    
    各列解釋：
    
    
    - `S0C`, `S1C`：第 0、1 Survivor 空間的容量（KB）。
    - `S0U`, `S1U`：第 0、1 Survivor 空間的使用量（KB）。
    - `EC`, `EU`：Eden 空間的容量和使用量。
    - `OC`, `OU`：Old 空間的容量和使用量。
    - `MC`, `MU`：元數據空間（Metaspace）的容量和使用量。
    - `CCSC`, `CCSU`：壓縮類空間的容量和使用量。
    - `YGC`, `YGCT`：年輕代 GC 的次數及時間。
    - `FGC`, `FGCT`：老年代 GC 的次數及時間。
    - `GCT`：總 GC 時間。
- `jstat -gcutil <pid>`：顯示垃圾回收區的使用百分比。
    
    ```
    jstat -gcutil <pid> <span class="hljs-number">1000</span> <span class="hljs-number">5</span>
    
    ```
    
    這會顯示各個區域使用率的百分比，方便快速查看內存使用情況。
- `jstat -class <pid>`：顯示加載類的統計數據。
    
    ```
    jstat -<span class="hljs-class"><span class="hljs-keyword">class</span> <pid> 1000 5</span>
    
    ```
    
    這會顯示 JVM 中類的加載數量、總字節數、卸載數量等。
- `jstat -compiler <pid>`：顯示 JIT 編譯器的統計信息。
    
    ```
    jstat -compiler <pid> <span class="hljs-number">1000</span> <span class="hljs-number">5</span>
    
    ```
    
    這會顯示 JIT 編譯的次數和時間，有助於了解編譯行為的情況。

### 實用範例

- 查看特定進程的垃圾回收行為：
    
    ```
    jstat -gc <span class="hljs-number">12345</span> <span class="hljs-number">2000</span>
    
    ```
    
    每隔 2 秒（2000 毫秒）更新一次數據，直到手動中斷。
- 查看特定進程的內存區域使用率百分比：
    
    ```
    jstat -gcutil <span class="hljs-number">12345</span> <span class="hljs-number">500</span> <span class="hljs-number">10</span>
    
    ```
    
    每隔 0.5 秒更新一次，共更新 10 次。

### 小結

`jstat` 是一個高效且簡單的工具，可以讓開發者和運維人員更深入地了解 JVM 的內存使用和垃圾回收情況。在診斷性能瓶頸和內存相關問題時，`jstat` 是不可或缺的工具。