jvm常用的參數有哪些? 怎么配置?
JVM 參數是控制 Java 虛擬機運行行為的核心配置,主要用于內存分配、垃圾回收(GC)調優、日志輸出、調試監控等場景。合理配置 JVM 參數能避免 OOM(內存溢出)、優化 GC 性能、提升應用穩定性。以下按功能分類梳理常用參數及配置方式。
一、內存配置參數(最核心,必配)
JVM 內存模型主要包括堆(Heap)、方法區(元空間)、虛擬機棧、本地方法棧、程序計數器,其中堆和元空間是內存配置的重點(棧內存通常無需頻繁調整)。
1. 堆內存配置(Heap)
堆是 JVM 中最大的內存區域,用于存儲對象實例,分為新生代(Young Generation) 和老年代(Old Generation),新生代又分為 Eden 區和兩個 Survivor 區(S0、S1)。
| 參數 | 作用 | 配置示例 | 說明 |
|---|---|---|---|
-Xms |
初始堆內存大小 | -Xms512m(初始 512MB) |
建議與-Xmx保持一致,避免堆動態擴容 / 縮容的性能開銷 |
-Xmx |
最大堆內存大小 | -Xmx2g(最大 2GB) |
根據服務器內存配置(如 8GB 服務器可設為 4-6GB,預留系統和其他進程內存) |
-Xmn |
新生代內存大小(Eden + S0 + S1) | -Xmn1g(新生代 1GB) |
新生代占堆的 1/3~1/2 較合理(太小會導致對象提前進入老年代,太大則老年代變小,頻繁 Full GC) |
-XX:SurvivorRatio |
Eden 區與單個 Survivor 區的比例 | -XX:SurvivorRatio=8(默認 8) |
表示 Eden:S0:S1 = 8:1:1(總新生代 10 份,Eden 占 8 份,S0 和 S1 各 1 份) |
-XX:NewRatio |
老年代與新生代的比例(替代-Xmn) |
-XX:NewRatio=2(默認 2) |
表示老年代:新生代 = 2:1(堆總大小 3 份,老年代 2 份,新生代 1 份) |
2. 方法區 / 元空間配置(Metaspace)
- JDK 7 及之前:方法區通過 “永久代(PermGen)” 實現,用
-XX:PermSize和-XX:MaxPermSize配置(已廢棄)。 - JDK 8 及之后:方法區通過 “元空間(Metaspace)” 實現,元空間默認使用本地內存(不受堆大小限制),需配置以下參數避免元空間溢出(類太多時可能 OOM)。
| 參數 | 作用 | 配置示例 | 說明 |
|---|---|---|---|
-XX:MetaspaceSize |
元空間初始大?。ㄓ|發 GC 閾值) | -XX:MetaspaceSize=128m |
達到該值時會觸發元空間 GC(類卸載),默認約 21MB(太小會頻繁觸發 GC) |
-XX:MaxMetaspaceSize |
元空間最大大小 | -XX:MaxMetaspaceSize=256m |
限制元空間最大占用(如不設置,可能耗盡本地內存導致系統 OOM) |
3. 棧內存配置(虛擬機棧)
每個線程對應一個虛擬機棧,存儲方法調用的棧幀(局部變量、操作數棧等),棧內存過小可能導致
StackOverflowError(遞歸過深)。| 參數 | 作用 | 配置示例 | 說明 |
|---|---|---|---|
-Xss |
每個線程的棧內存大小 | -Xss1m(1MB) |
默認值:JDK 1.8 中 Windows 約 1MB,Linux 約 0.5MB;遞歸深的應用需調大(如 -Xss2m) |
二、垃圾回收器(GC)配置參數
JVM 提供多種垃圾回收器(如 Serial GC、Parallel GC、CMS、G1、ZGC 等),需根據應用類型(吞吐量優先 / 低延遲優先)選擇。
1. 選擇 GC 收集器
| 收集器 | 啟用參數 | 適用場景 | 特點 |
|---|---|---|---|
| Serial GC | -XX:+UseSerialGC |
單線程環境、小型應用(如嵌入式設備) | 單線程回收,簡單高效但停頓時間長(不適合多 CPU 服務器) |
| Parallel GC | -XX:+UseParallelGC(默認 JDK8) |
吞吐量優先的應用(如后臺批處理) | 多線程回收,注重吞吐量(總 GC 時間 / 總運行時間),停頓時間較長 |
| CMS GC | -XX:+UseConcMarkSweepGC |
低延遲優先的應用(如 Web 服務) | 并發標記清除,停頓時間短(但 CPU 占用高、內存碎片多,JDK9 后 deprecated) |
| G1 GC | -XX:+UseG1GC(默認 JDK9+) |
中大型堆(4GB 以上)、平衡吞吐量和延遲 | 區域化分代式,可預測停頓(設置-XX:MaxGCPauseMillis控制目標停頓) |
| ZGC | -XX:+UseZGC(JDK11+,實驗性) |
超大堆(16GB 以上)、低延遲(毫秒級停頓) | 并發回收,停頓時間極短(<10ms),支持動態堆大小 |
2. GC 調優核心參數(以 G1 為例)
| 參數 | 作用 | 配置示例 |
|---|---|---|
-XX:MaxGCPauseMillis |
G1 目標最大停頓時間(默認 200ms) | -XX:MaxGCPauseMillis=100(目標停頓 100ms) |
-XX:G1HeapRegionSize |
G1 區域大?。?MB~32MB,2 的冪次方) | -XX:G1HeapRegionSize=4m(每個區域 4MB) |
-XX:InitiatingHeapOccupancyPercent |
G1 觸發混合回收的老年代占比(默認 45%) | -XX:InitiatingHeapOccupancyPercent=50 |
三、GC 日志配置參數(問題排查必備)
GC 日志用于分析 GC 頻率、停頓時間、內存變化等,是排查 OOM、GC 頻繁等問題的關鍵依據。
| 參數 | 作用 | 配置示例 |
|---|---|---|
-XX:+PrintGCDetails |
輸出詳細 GC 日志(包括各區域內存變化) | 需配合其他日志參數使用 |
-XX:+PrintGCDateStamps |
日志中添加時間戳(yyyy-MM-dd HH:mm:ss) | 便于定位 GC 發生的具體時間 |
-Xloggc:<file> |
將 GC 日志輸出到指定文件 | -Xloggc:/var/log/myapp/gc.log |
-XX:+UseGCLogFileRotation |
啟用 GC 日志輪轉(避免單文件過大) | 需配合以下參數 |
-XX:NumberOfGCLogFiles=<n> |
日志文件最大數量 | -XX:NumberOfGCLogFiles=5(保留 5 個文件) |
-XX:GCLogFileSize=<size> |
單個日志文件大小閾值(超過則輪轉) | -XX:GCLogFileSize=100m(每個文件 100MB) |
四、調試與監控參數(問題排查)
用于在應用異常時生成診斷信息(如 OOM 時的堆快照)、啟用遠程調試等。
| 參數 | 作用 | 配置示例 |
|---|---|---|
-XX:+HeapDumpOnOutOfMemoryError |
OOM 時自動生成堆轉儲文件(.hprof) | 配合 -XX:HeapDumpPath 使用 |
-XX:HeapDumpPath=<path> |
指定堆轉儲文件路徑 | -XX:HeapDumpPath=/var/log/myapp/oom.hprof |
-XX:+PrintHeapAtGC |
GC 前后打印堆內存分布 | 用于分析 GC 對內存的影響 |
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 |
啟用遠程調試(JDK5+) | 允許 IDE 通過 5005 端口遠程調試應用 |
五、其他常用參數
| 參數 | 作用 | 配置示例 |
|---|---|---|
-XX:+UseCompressedOops |
啟用對象指針壓縮(64 位 JVM 默認開啟) | 減少指針占用內存(從 8 字節→4 字節) |
-XX:MaxDirectMemorySize |
直接內存(Direct Memory)最大大小 | -XX:MaxDirectMemorySize=512m(默認與堆最大值一致) |
-Duser.timezone=GMT+8 |
設置 JVM 時區(避免時間處理異常) | -Duser.timezone=Asia/Shanghai |
六、參數配置方式
JVM 參數通過啟動 Java 程序時的命令行參數指定,格式為:
java [JVM參數] -jar 應用.jar
示例:典型 Web 應用配置(8GB 服務器,G1 GC)
java \
-Xms4g -Xmx4g \ # 堆初始和最大4GB
-Xmn2g \ # 新生代2GB(占堆的1/2)
-XX:SurvivorRatio=8 \ # Eden:S0:S1=8:1:1
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m \ # 元空間
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 \ # G1 GC,目標停頓100ms
-Xloggc:/var/log/app/gc.log \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100m \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/oom.hprof \
-jar app.jar
注意事項
-
參數前綴區分:
-:標準參數(如-jar、-D);-X:非標準參數(如-Xms、-Xmx);-XX:高級參數(如-XX:+UseG1GC),這類參數可能隨 JDK 版本變化。
-
版本兼容性:部分參數在高版本 JDK 中廢棄(如 CMS GC 在 JDK9 后標記為 deprecated,JDK14 移除),需根據實際 JDK 版本調整。
-
避免過度配置:優先保證
-Xms、-Xmx、GC 類型、日志和 OOM 快照參數,其他參數在有明確性能問題時再調優(通過 JProfiler、VisualVM 等工具分析后調整)。
總結
JVM 參數的核心是內存分配和GC 配置,需根據應用類型(Web / 批處理)、服務器資源、性能需求調整。日常開發中,至少要配置堆內存大小、GC 日志、OOM 快照參數,以便問題排查;高并發場景需進一步優化 GC 收集器和停頓時間。
郭慕榮博客園

浙公網安備 33010602011771號