JVM 常用调优参数(2024-2025 最新推荐)
JVM 调优主要围绕内存分配、垃圾回收器、GC 行为、线程和诊断等方面。以下是目前(JDK 8 ~ JDK 21+)最常用、最推荐的调优参数。
1. 堆内存相关(最核心、最常用)
| 参数 | 作用说明 | 推荐写法示例 | 说明 |
|---|---|---|---|
-Xms | 初始堆大小(Initial Heap Size) | -Xms4g | 建议与 -Xmx 设为相同值,避免频繁扩容 |
-Xmx | 最大堆大小(Maximum Heap Size) | -Xmx4g | 生产环境通常设为容器内存的 70-80% |
-Xmn / -XX:NewSize / -XX:MaxNewSize | 年轻代大小(Eden + Survivor) | -Xmn1g 或 -XX:NewRatio=2 | G1 通常不建议手动设,Parallel/CMS 可设 |
-XX:MaxMetaspaceSize | 元空间最大值(JDK8+,取代了 PermSize) | -XX:MaxMetaspaceSize=512m | 默认无上限,建议设置上限防止 OOM |
-XX:MetaspaceSize | 元空间初始触发 GC 大小 | -XX:MetaspaceSize=128m | 一般设为 MaxMetaspaceSize 的 1/4~1/2 |
推荐原则:容器化部署(Docker/K8s)时,优先使用百分比:
-XX:MaxRAMPercentage=75.0
-XX:InitialRAMPercentage=75.0
2. 垃圾回收器选择(最重要决定)
| 参数 | 推荐场景 | 示例 |
|---|---|---|
-XX:+UseG1GC | JDK8+ 默认推荐(JDK9+ 已经是默认),适合大堆(>6GB)、低延迟需求 | -XX:+UseG1GC |
-XX:+UseZGC | JDK11+,超低延迟(<10ms),大内存(>8GB)场景,JDK17+ 生产推荐 | -XX:+UseZGC -XX:ZAllocationSpikeTolerance=2 |
-XX:+UseShenandoahGC | 类似 ZGC,低暂停,OpenJDK 主流发行版支持良好 | -XX:+UseShenandoahGC |
-XX:+UseParallelGC | 吞吐量优先,小堆(<6GB),批处理任务 | -XX:+UseParallelGC |
-XX:+UseConcMarkSweepGC | JDK9+ 已废弃,不推荐新项目使用 | — |
2024-2025 推荐组合:
- 大多数新项目:
-XX:+UseG1GC - 追求极致低延迟(<10ms 暂停):
-XX:+UseZGC(JDK17+ 推荐) - 老项目兼容:
-XX:+UseG1GC
3. G1GC 常用调优参数(最常用垃圾回收器)
| 参数 | 作用说明 | 推荐值 / 示例 |
|---|---|---|
-XX:MaxGCPauseMillis | 期望最大 GC 暂停时间(软目标) | 200(默认200ms) |
-XX:G1HeapRegionSize | G1 区域大小(必须是 2 的幂) | 8m ~ 32m(大堆建议 16m/32m) |
-XX:InitiatingHeapOccupancyPercent | 老年代占用多少时触发并发 GC(IHOP) | 45(默认45%,可调低到35-40) |
-XX:G1ReservePercent | 预留给突发的空间百分比 | 15 ~ 25(默认10) |
-XX:ConcGCThreads | 并发 GC 线程数 | CPU核数/4 ~ CPU核数/2 |
-XX:ParallelGCThreads | 并行 GC 线程数(Young GC 和 Full GC) | CPU核数(默认根据核数自动) |
4. 其他高频调优参数
| 参数 | 作用说明 | 推荐写法 |
|---|---|---|
-XX:+AlwaysPreTouch | 启动时就把内存全部摸一遍(配合大页使用效果好) | 推荐开启 |
-XX:+UseStringDeduplication | 字符串去重(JDK8u20+) | 推荐开启(节省字符串内存) |
-XX:+DisableExplicitGC | 禁用代码中的 System.gc() | 强烈推荐开启 |
-XX:+HeapDumpOnOutOfMemoryError | OOM 时自动 dump 堆快照 | 必须开启 |
-XX:HeapDumpPath | 指定 dump 文件路径 | /data/dump/heapdump.hprof |
-XX:+PrintGCDetails | 打印详细 GC 日志(JDK9+ 推荐用 -Xlog:gc*) | 调试时开启 |
-Xlog:gc*:file=gc.log:time,level,tags | JDK9+ 推荐的 GC 日志格式 | 生产环境推荐 |
-XX:+UseLargePages | 使用大页内存(需 OS 支持) | 高性能场景可开启 |
-XX:SurvivorRatio | Eden : Survivor 比例 | 默认 8(Eden 占 80%) |
-XX:MaxTenuringThreshold | 对象晋升老年代前在 Survivor 区存活次数 | 默认 15,可调到 6-10 |
5. 2024-2025 推荐启动参数模板(G1GC)
中小型应用(4-8GB 堆):
-server
-Xms4g
-Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=8m
-XX:InitiatingHeapOccupancyPercent=45
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/dump/
-XX:+PrintGCDetails
-Xlog:gc*:file=/data/log/gc.log:time,level,tags
大型低延迟应用(16GB+ 堆,推荐 ZGC):
-server
-Xms16g
-Xmx16g
-XX:+UseZGC
-XX:ConcGCThreads=6 # 根据 CPU 核数调整
-XX:ParallelGCThreads=12
-XX:+AlwaysPreTouch
-XX:+HeapDumpOnOutOfMemoryError
-Xlog:gc*:file=/data/log/gc.log
6. 调优建议顺序(推荐流程)
- 先把堆大小设对(
-Xms = -Xmx) - 选择合适的 GC(G1 → ZGC/Shenandoah)
- 观察 GC 日志 + 监控(GC 次数、暂停时间、堆使用率)
- 微调 G1 参数(MaxGCPauseMillis、IHOP、ReservePercent)
- 最后考虑字符串去重、大页、NUMA 等高级选项