在理想情況下,JVM 預設參數已足以應付大多數 Java 程式。但面對效能瓶頸時,理解並調整記憶體管理參數至關重要。本文系統整理 HotSpot JVM 的關鍵記憶體參數,助開發與運維人員精準調優。
傳統 HotSpot 將堆劃分為三大區域:
新版 G1 收集器模糊了新生代/老年代界限;未來版本傾向合併老年代與永久代。
指定 JVM 初始與最大堆大小。單位預設為 Byte,支援 k/K、m/M、g/G 速記。
java -Xms128m -Xmx2g MyApp # 等同於 java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp
實務建議:將 -Xms 與 -Xmx 設為相同值,避免運行時動態擴縮容帶來的效能抖動。監控時請關注完整參數名 InitialHeapSize、MaxHeapSize。
發生 OutOfMemoryError 時自動產生 Heap Dump,預設存於啟動目錄下的 java_pid.hprof。建議透過 -XX:HeapDumpPath=/path/with/space 指定至磁碟空間充足處,避免 Dump 檔過大填滿磁碟。
OOM 發生時執行自定指令(如發送告警、執行清理腳本):
java -XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/tmp/heapdump.hprof \
-XX:OnOutOfMemoryError="/path/cleanup.sh" MyApp
設定永久代初始/最大大小。注意:永久代不包含在 -Xmx 限制內,需額外規劃機器記憶體。
java -XX:PermSize=128m -XX:MaxPermSize=256m MyApp
-XX:MetaspaceSize:觸發 Full GC 的初始閾值-XX:MaxMetaspaceSize:上限(預設無上限,受限於實體記憶體)JIT 編譯產生的本機碼儲存於 Code Cache。滿溢時 JVM 會停用 JIT,退回解譯模式,效能暴跌。
設定初始與保留最大大小,單位同堆參數。
啟用 Code Cache 清理機制:當滿溢時捨棄部分編譯碼,避免進入 interpreted-only 模式。但根因(如熱部署導致的記憶體洩漏)仍需徹查修復。
-Xms=Xmx),觀察 GC 日誌與記憶體佔用曲線。-XX:NewRatio、-XX:SurvivorRatio)。-XX:+PrintCommandLineFlags 或 JMX 確認實際生效參數。掌握這些參數,配合 GC 日誌分析工具(如 GCViewer、GCEasy),即可從容應對生產環境記憶體挑戰。