JVisualVM(JDK 6u7+ 內建 `bin/jvisualvm.exe`)是基於 NetBeans 平台的可視化監控工具,整合執行緒、堆、GC、CPU、類別、MBean等功能,支援本地/遠程監控、Heap Dump 分析、記憶體洩漏定位、效能剖析。本文透過模擬洩漏案例實戰演示核心分析流程。
public class CyclicDependencies {
private static final Map<String, Object> cache = new HashMap<>(); // 靜態集合持有引用
public static void main(String[] args) throws InterruptedException {
Thread.sleep(10000); // 預留開啟 VisualVM 時間
for (int phase = 1; phase <= 4; phase++) {
for (int i = 0; i < 1_000_000 * phase; i++) {
cache.put("key" + i, new TestMemory()); // 持續放入,永不釋放
}
System.out.println("phase " + phase);
Thread.sleep(10000); // 預留 Dump 時間
}
}
}
class TestMemory { byte[] data = new byte[1024]; } // 每對象 1KB
JVM 參數:`-Xms512m -Xmx512m -XX:-UseGCOverheadLimit -XX:MaxPermSize=50m`
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.122.128 \
-Dcom.sun.management.jmxremote.port=18999 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"
| 場景 | 策略 | 關鍵參數 |
|---|---|---|
| 頻繁建立短命對象 | 增大新生代 | -Xmn, -XX:NewRatio |
| 大量常量/類元資料 | 增大元空間 | -XX:MaxMetaspaceSize |
| 長壽單例/快取對象多 | 增大老年代 | -Xmx, -XX:NewRatio |
| 高吞吐量(批次/計算) | 並行 GC | -XX:+UseParallelGC |
| 低延遲(Web/服務) | 並發 GC (CMS/G1/ZGC) | -XX:+UseG1GC / -XX:+UseZGC |
CMS 老年代建議:`-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=10`
掌握 JVisualVM 全功能棧,讓 JVM 調優從「玄學」變為「有據可依的工程科學」。