首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JConsole 可視化監控實戰:JVM 內存、線程、死鎖診斷全流程

     編輯:Java 程式設計入門

一、JConsole 快速入門

  • 啟動:JDK bin/jconsole.exe 或命令行輸入 jconsole
  • 連接:本地進程列表雙擊,或遠程輸入 host:port(需啟用 JMX)
  • 核心頁簽:概覽、內存、線程、類、VM 摘要、MBeans

二、內存監控:可視化 jstat

實時展示堆/非堆內存使用曲線,支持手動觸發 GC。

  • 堆內存:新生代、老年代、元空間(JDK 8+)
  • 關鍵指標:已用/提交/最大值、GC 頻率與耗時
  • 異常模式:鋸齒圖正常;持續上升不下降 → 內存洩漏;頻繁 Full GC → 壓力過大

三、線程診斷:可視化 jstack

3.1 線程狀態解讀

狀態含義典型場景
RUNNABLE運行中或就緒計算密集、空循環、I/O 等待(部分實現)
BLOCKED等待監視器鎖synchronized 進入阻塞
WAITING無限期等待Object.wait()、Thread.join()
TIMED_WAITING限時等待Thread.sleep()、wait(timeout)

3.2 死循環檢測實戰

// 佔用 CPU 100% 的空循環線程
while (true) { } // 線程狀態 RUNNABLE,堆棧停留在此行

JConsole 表現:CPU 曲線飆升,該線程長期 RUNNABLE 且堆棧不變。

3.3 鎖等待與死鎖分析

活鎖:線程 WAITING 於 lock.wait(),需 notify() 喚醒。
死鎖:多線程循環持有鎖並等待對方釋放。

死鎖復現代碼(Integer 緩存陷阱)

static class DeadLockTask implements Runnable {
    int a, b;
    DeadLockTask(int a, int b) { this.a = a; this.b = b; }
    public void run() {
        synchronized (Integer.valueOf(a)) { // [-128,127] 緩存導致同對象
            synchronized (Integer.valueOf(b)) {
                System.out.println(a + b);
            }
        }
    }
}

// 啟動 200 線程:100 個 (1,2) + 100 個 (2,1) → 極大概率死鎖
for (int i = 0; i < 100; i++) {
    new Thread(new DeadLockTask(1, 2)).start();
    new Thread(new DeadLockTask(2, 1)).start();
}

JConsole 死鎖檢測步驟

  1. 線程頁簽 → 勾選「檢測死鎖」
  2. 出現「死鎖」標籤 → 點擊查看詳情
  3. 顯示死鎖線程名、持有鎖、等待鎖、完整堆棧

四、類加載監控

  • 已加載類數量趨勢圖
  • 異常增長提示:類加載器洩漏、動態代理生成過多類、JSP 重編譯

五、MBeans 進階管理

  • 動態調整日志級別
  • 觸發堆轉儲
  • 查看/修改系統屬性、線程池參數
  • 自定義 MBean 暴露業務指標

六、生產環境最佳實踐

  1. 遠程連接配置:
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=9999
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.rmi.server.hostname=你的服務器IP
  2. 安全建議:生產務必啟用認證、SSL、IP 白名單
  3. 性能影響:JConsole 本身消耗資源,診斷完及時斷開
  4. 輔助工具:配合 jmap、jhat、VisualVM、Arthas、Async Profiler 進行深度分析

七、總結:JConsole 核心價值

零依賴、開箱即用的 JVM「體檢儀」,擅長快速定位:內存洩漏趨勢、線程阻塞/死鎖、CPU 熱點、類加載異常。深度分析請轉專業 Profilers。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved