跳到主要内容
EN

JVM 调优参数详解

12 分钟阅读

JVM 参数分类

JVM 参数分为三类:

类型 格式 说明
标准参数 - 所有 JVM 实现都支持(如 -version-cp
非标准参数 -X 不保证所有 JVM 支持但常见(如 -Xms-Xmx
不稳定参数 -XX 特定 JVM 实现的扩展参数(如 -XX:+UseG1GC

不稳定参数的布尔类型使用 +/- 开关:

  • -XX:+UseG1GC 启用
  • -XX:-UseG1GC 禁用

非布尔类型使用 = 赋值:

  • -XX:MaxHeapSize=4g

内存参数

堆内存

参数 说明 推荐值
-Xms 初始堆大小 与 -Xmx 相同
-Xmx 最大堆大小 物理内存的 50-80%
-Xmn 新生代大小 堆的 30-40%
-XX:NewRatio 老年代/新生代比例 2(默认)
-XX:SurvivorRatio Eden/Survivor 比例 8(默认)
-XX:MaxTenuringThreshold 对象晋升老年代年龄 15(默认)
-XX:PretenureSizeThreshold 大对象直接在老年代分配的阈值 无默认值

最佳实践

# 生产环境推荐
-Xms4g -Xmx4g        # 固定堆大小,避免动态扩缩容
-Xmn1536m            # 新生代约为堆的 37.5%
-XX:SurvivorRatio=8  # Eden:S0:S1 = 8:1:1
-XX:MaxTenuringThreshold=15

为什么 -Xms 和 -Xmx 设为相同?

  • 避免堆大小调整带来的性能抖动
  • 避免扩容时的 Full GC
  • 提前分配内存,确保可用

非堆内存

参数 说明 推荐值
-XX:MetaspaceSize 元空间初始大小 256m
-XX:MaxMetaspaceSize 元空间最大大小 256m-512m
-Xss 每个线程栈大小 256k-1m
-XX:MaxDirectMemorySize 直接内存最大值 与 -Xmx 相同
-XX:ReservedCodeCacheSize JIT 代码缓存大小 240m(默认)
# 元空间推荐
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m

# 线程栈
-Xss512k    # 普通应用
-Xss256k    # 高并发应用(线程数多时节省内存)

GC 参数

收集器选择

参数 收集器组合
-XX:+UseSerialGC Serial + Serial Old
-XX:+UseParNewGC ParNew + Serial Old
-XX:+UseParallelGC Parallel Scavenge + Parallel Old
-XX:+UseConcMarkSweepGC ParNew + CMS + Serial Old(后备)
-XX:+UseG1GC G1
-XX:+UseZGC ZGC
-XX:+UseShenandoahGC Shenandoah

Parallel Scavenge 参数

参数 说明 默认值
-XX:MaxGCPauseMillis 最大 GC 停顿目标
-XX:GCTimeRatio 吞吐量目标 99
-XX:+UseAdaptiveSizePolicy 自适应调节 开启
-XX:ParallelGCThreads GC 线程数 CPU 核数

CMS 参数

参数 说明 默认值
-XX:CMSInitiatingOccupancyFraction 老年代占用率触发阈值 68(首次)/92
-XX:+UseCMSCompactAtFullCollection Full GC 后整理碎片 开启
-XX:CMSFullGCsBeforeCompaction 多少次 Full GC 后整理 0
-XX:ConcGCThreads 并发 GC 线程数 (ParallelGCThreads+3)/4
-XX:+CMSParallelRemarkEnabled 并行重新标记 开启
-XX:+CMSParallelSurvivorRemarkEnabled 并行 Survivor 重新标记 开启

G1 参数

参数 说明 默认值
-XX:MaxGCPauseMillis 目标停顿时间 200ms
-XX:G1HeapRegionSize Region 大小 自动计算
-XX:InitiatingHeapOccupancyPercent 触发并发标记的堆占用率 45%
-XX:G1MixedGCCountTarget Mixed GC 次数目标 8
-XX:G1MixedGCLiveThresholdPercent Region 存活率回收阈值 85%
-XX:G1ReservePercent 保留空间防止晋升失败 10%
-XX:ParallelGCThreads STW 阶段并行线程数 CPU 核数
-XX:ConcGCThreads 并发阶段线程数 max(1, ParallelGCThreads/4)

ZGC 参数

参数 说明 默认值
-XX:ZCollectionInterval GC 间隔(0=自适应) 0
-XX:ZAllocationSpikeTolerance 分配突发容忍度 1
-XX:ZFragmentationLimit 碎片率上限 5%
-XX:+ZGenerational 分代模式(JDK 21+) 关闭

JIT 编译参数

参数 说明 默认值
-XX:+TieredCompilation 分层编译 开启
-XX:CompileThreshold 方法调用 JIT 阈值 10000
-XX:CompileThresholdScaling 阈值缩放因子 1.0
-XX:+PrintCompilation 打印 JIT 编译日志 关闭
-XX:ReservedCodeCacheSize 代码缓存大小 240MB
-XX:+Inline 方法内联 开启
-XX:MaxInlineSize 内联方法最大字节码大小 35
-XX:FreqInlineSize 频繁调用方法内联上限 325
# JIT 调试
-XX:+PrintCompilation          # 查看哪些方法被 JIT 编译
-XX:+UnlockDiagnosticVMOptions # 解锁诊断选项
-XX:+LogCompilation            # 详细编译日志(XML 格式)

线程参数

参数 说明 默认值
-Xss 线程栈大小 平台相关
-XX:ThreadStackSize 线程栈大小(同 -Xss) 平台相关
-XX:+UseThreadPriorities 使用线程优先级 开启
# 高并发应用线程栈计算
# 可用内存 = 物理内存 - 堆 - 元空间 - 代码缓存 - OS保留
# 最大线程数 ≈ 可用内存 / Xss
# 例: (8G - 4G - 512M - 240M - 500M) / 512K ≈ 5400 线程

诊断参数

参数 说明
-XX:+HeapDumpOnOutOfMemoryError OOM 时自动 dump 堆
-XX:HeapDumpPath=/path/to/dump dump 文件路径
-XX:ErrorFile=/path/to/hs_err.log 致命错误日志路径
-XX:+PrintGCDetails 打印 GC 详情(JDK 8)
-XX:+PrintGCDateStamps 打印 GC 时间戳(JDK 8)
-Xlog:gc*:file=gc.log GC 日志(JDK 9+)
-XX:+PrintSafepointStatistics 打印安全点统计
-XX:+PrintTLAB 打印 TLAB 信息
-XX:+TraceClassLoading 跟踪类加载
-XX:+TraceClassUnloading 跟踪类卸载

参数分类速查表

按场景分类

Web 服务(Spring Boot)

java -Xms2g -Xmx2g \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/heapdump.hprof \
     -Xlog:gc*:file=/var/log/gc.log:time,uptime:filecount=5,filesize=20m \
     -jar app.jar

大数据(Spark/Flink)

java -Xms8g -Xmx8g \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=100 \
     -XX:G1HeapRegionSize=16m \
     -XX:InitiatingHeapOccupancyPercent=35 \
     -XX:ParallelGCThreads=8 \
     -XX:ConcGCThreads=2 \
     -XX:+HeapDumpOnOutOfMemoryError \
     -jar app.jar

低延迟(交易系统)

java -Xms4g -Xmx4g \
     -XX:+UseZGC \
     -XX:ZAllocationSpikeTolerance=2 \
     -XX:ConcGCThreads=2 \
     -XX:+UnlockDiagnosticVMOptions \
     -XX:+ZStatisticsForceTrace \
     -XX:+HeapDumpOnOutOfMemoryError \
     -jar app.jar

微服务(Docker 容器)

java -Xms512m -Xmx512m \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=100 \
     -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m \
     -XX:+UseContainerSupport \
     -XX:MaxRAMPercentage=75.0 \
     -jar app.jar

容器感知参数

参数 说明 默认值
-XX:+UseContainerSupport 启用容器感知 开启(JDK 10+)
-XX:MaxRAMPercentage 最大堆占容器内存比例 25%
-XX:InitialRAMPercentage 初始堆占容器内存比例 25%
-XX:MinRAMPercentage 最小堆占容器内存比例 50%
# Docker 容器推荐(4GB 容器内存)
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0     # 3GB 堆
-XX:InitialRAMPercentage=75.0 # 初始堆 = 最大堆

查看运行时参数

# 查看所有 JVM 参数(含默认值)
java -XX:+PrintFlagsFinal -version | grep -i "g1\|heap\|gc"

# 查看已被用户修改的参数
java -XX:+PrintCommandLineFlags -version

# 运行时查看
jcmd <pid> VM.flags
jcmd <pid> VM.command_line
jinfo -flags <pid>

小结

本章系统梳理了 JVM 调优参数:内存参数控制各区域大小,GC 参数选择收集器和调整策略,JIT 参数优化编译行为,诊断参数帮助排查问题。生产环境中推荐根据场景选择预设模板,再根据实际监控数据微调。下一章将通过综合调优实战案例将所有知识串联起来。

编辑此页

评论