JConsole 在 Linux 上的使用指南
1. 啟動 JConsole 遠程監控 Linux 服務器上的 JVM 進程
1.1 修改 JMX 配置,允許遠程訪問
在 Linux 服務器 啟動 Java 應用時,需要加上 -Djava.rmi.server.hostname=<服務器IP>
,完整的啟動參數如下:
java -Dcom.sun.management.jmxremote \-Dcom.sun.management.jmxremote.port=9010 \-Dcom.sun.management.jmxremote.rmi.port=9010 \-Dcom.sun.management.jmxremote.authenticate=false \-Dcom.sun.management.jmxremote.ssl=false \-Djava.rmi.server.hostname=你的服務器IP \-jar your-app.jar
參數說明:
-Djava.rmi.server.hostname=你的服務器IP
:指定 JMX 監聽的 IP 地址,必須是服務器的外網/內網 IP,否則無法遠程連接。-Dcom.sun.management.jmxremote.rmi.port=9010
:顯式指定 RMI 端口,避免 RMI 端口隨機化。
1.2 允許防火墻放行端口
如果你的服務器有 防火墻,需要放行 9010
端口:
# Ubuntu/Debian
sudo ufw allow 9010# CentOS
sudo firewall-cmd --add-port=9010/tcp --permanent
sudo firewall-cmd --reload
1.3 在本地 Windows/Mac 連接
在 本地電腦(Windows/Mac) 上運行:
jconsole 你的服務器IP:9010
如果 JMX 正常工作,你會看到 Java 進程的監控界面。
1.4 使用 SSH 端口轉發(更安全)
如果你不想直接暴露 9010
端口,可以使用 SSH 端口轉發:
ssh -L 9010:localhost:9010 user@你的服務器IP
然后在本地運行:
jconsole localhost:9010
這樣,遠程服務器的 9010
端口被映射到本地,避免安全風險。
最后結果如下:
2. JConsole 監控的 JVM 指標和圖表
JConsole 連接 Java 進程后,會展示 JVM 運行狀態的多個圖表和指標,主要包括以下幾個部分:
2.1 概述(Overview)
- CPU 使用率(折線圖)
- 線程(Threads) 數量變化
- 堆內存(Heap Memory Usage)(折線圖)
- 類加載(Classes) 統計
2.2 內存(Memory)
- 堆(Heap)
- Eden Space(伊甸區):新對象存放,GC 頻繁。
- Survivor Space(幸存者區):存活的對象從 Eden 復制到這里。
- Old Gen(老年代):長期存活的對象存放區域。
- 非堆(Non-Heap)
- Metaspace(元空間):存放類元數據。
- Code Cache(代碼緩存區):存儲 JIT 編譯后的本地代碼。
2.3 線程(Threads)
- 線程狀態統計
- 線程堆棧(Thread Dump)
2.4 GC(Garbage Collection)
- GC 次數和耗時(折線圖)
- Minor GC(年輕代 GC)
- Major GC / Full GC(老年代 GC)
3. JDK 11 的 JVM 內存結構
3.1 堆(Heap)
- 年輕代(Young Gen)
- Eden 區:新對象存放,觸發 Minor GC。
- Survivor 區(S0/S1):存活對象從 Eden 復制到 Survivor 區。
- 老年代(Old Gen)
- 存放長期存活的對象,觸發 Full GC。
3.2 非堆(Non-Heap)
- Metaspace(元空間):JDK 8 移除了永久代(PermGen),改用 Metaspace 存放類元數據。
- Code Cache(代碼緩存區):存放 JIT 編譯后的機器碼。
3.3 線程棧(Thread Stack)
- 棧幀(Stack Frame):存放方法調用的局部變量、操作數棧等。
- 本地方法棧(Native Stack):存放 JNI 方法。
3.4 直接內存(Direct Memory)
- 由
ByteBuffer.allocateDirect()
申請,避免堆內存復制,提高 IO 性能。