前言
JVM 是 Java 效能與穩定性的核心引擎。理解關鍵啟動參數,能在生產事故中快速定位問題、在效能調優時精準施策。以下 5 個參數是資深開發者的必備工具箱。
1. -XX:+DisableExplicitGC:禁用 System.gc()
// 程式碼中常見的反模式
System.gc(); // 強制 Full GC,極其昂貴
- 啟用後:
System.gc() 變為 no-op
- 適用場景:程式碼庫包含大量不當
System.gc() 呼叫 (第三方庫、舊代碼)
- 驗證:對比啟用前後 GC 日誌的 Full GC 頻率與停頓時間
2. -XX:+HeapDumpOnOutOfMemoryError:OOM 時自動堆轉儲
# 完整參數組合
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/heapdumps/java_pid.hprof
- JVM 在拋出
OutOfMemoryError 前自動寫入二進位堆快照
- 事後使用
jhat、Eclipse MAT、VisualVM、JProfiler 分析
- 生產環境必開,磁碟空間預留至少 1.5 倍堆大小
3. -Xbootclasspath/p:ahead.jar:引導類路徑前置覆蓋
- 場景:修補 JDK 核心類 (如
java.lang.String、加密提供者、JCE 政策)
-Xbootclasspath/p:path:前置 (優先載入)
-Xbootclasspath/a:path:附加 (次於 rt.jar)
- 警告:違反 Oracle JDK 授權條款 (修改 rt.jar),生產環境慎用,優先尋找標準擴展點 (SPI、Security Provider)
4. -verbose:gc,class,jni:啟動診斷輸出
| 子參數 | 用途 | 典型輸出 |
-verbose:gc | GC 事件追蹤 | [GC (Allocation Failure) 123M->45M(256M), 0.012s] |
-verbose:class | 類載入追蹤 | [Loaded java.lang.Object from /jre/lib/rt.jar] |
-verbose:jni | JNI 活動追蹤 | [JNI] RegisterNatives for java/lang/String |
- GC 日誌解讀關鍵:
Full GC 代表全堆掃描,頻率高表示記憶體壓力大或洩漏
- 類載入日誌可定位
NoClassDefFoundError、版本衝突、類載入器洩漏
5. -X 參數列表:探索非標準選項
java -X
常用非標準參數:
| 參數 | 功能 |
-Xint | 純解釋執行 (禁用 JIT),對比驗證 JIT 效果 |
-Xloggc:file | GC 日誌寫入檔案 (而非 stdout) |
-Xms | 初始堆大小 |
-Xmx | 最大堆大小 |
-Xss | 執行緒堆疊大小 |
生產環境建議組合
# 基礎監控
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heapdumps/
-Xloggc:/logs/gc/gc_%p_%t.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime
# 穩定性
-XX:+DisableExplicitGC
-XX:+UseCompressedOops (32GB 以下堆)
總結
這 5 類參數涵蓋 **GC 控制、事故現場保存、核心類隔離、啟動診斷、參數探索**。熟練運用並結合 jstat、jmap、jstack、Arthas、Async Profiler 等工具,構建完整 JVM 可觀測體系。
- 上一篇文章: Java 程式設計偏執式技巧 10 選:防禦性編碼實戰精選
- 下一篇文章: Laravel Debugbar 安裝與表單助手設定完整教學
Copyright ©
程式碼之家 All Rights Reserved