bin/jconsole.exe 或命令行輸入 jconsolehost:port(需啟用 JMX)實時展示堆/非堆內存使用曲線,支持手動觸發 GC。
| 狀態 | 含義 | 典型場景 |
|---|---|---|
| RUNNABLE | 運行中或就緒 | 計算密集、空循環、I/O 等待(部分實現) |
| BLOCKED | 等待監視器鎖 | synchronized 進入阻塞 |
| WAITING | 無限期等待 | Object.wait()、Thread.join() |
| TIMED_WAITING | 限時等待 | Thread.sleep()、wait(timeout) |
// 佔用 CPU 100% 的空循環線程
while (true) { } // 線程狀態 RUNNABLE,堆棧停留在此行
JConsole 表現:CPU 曲線飆升,該線程長期 RUNNABLE 且堆棧不變。
活鎖:線程 WAITING 於 lock.wait(),需 notify() 喚醒。
死鎖:多線程循環持有鎖並等待對方釋放。
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();
}
-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
jmap、jhat、VisualVM、Arthas、Async Profiler 進行深度分析零依賴、開箱即用的 JVM「體檢儀」,擅長快速定位:內存洩漏趨勢、線程阻塞/死鎖、CPU 熱點、類加載異常。深度分析請轉專業 Profilers。