一、内存区域配置
堆内存相关
| 参数 | 作用 | 值类型 | 适用场景 |
-Xms | 初始堆大小 | 字节单位(如2g, 2048m) | 生产环境建议与Xmx相同避免扩容 |
-Xmx | 最大堆大小 | 字节单位 | 根据应用内存需求设定,不超过物理内存80% |
-Xmn | 年轻代大小 | 字节单位 | 老年代 = Xmx - Xmn,需权衡YGC/FGC频率 |
-XX:NewRatio | 老年代/年轻代比例 | 整数(默认2) | 替代-Xmn的比例设置方式 |
-Xss | 线程栈大小 | 字节单位(默认1m) | 高并发应用可适当减小,如256k |
组合建议:
-Xms4g -Xmx4g -Xmn1g:堆固定4G,年轻代1G
-Xms8g -Xmx8g -XX:NewRatio=3:堆8G,老年代:年轻代=3:1
二、垃圾收集器配置
通用参数
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+UseG1GC | 启用G1收集器 | 布尔 | JDK9+默认,大堆、低延迟 |
-XX:+UseConcMarkSweepGC | 启用CMS收集器 | 布尔 | JDK9前老年代并发收集 |
-XX:+UseParallelGC | 启用并行收集器 | 布尔 | 吞吐量优先,JDK8默认 |
-XX:+UseZGC | 启用ZGC | 布尔 | JDK11+,超大堆、极低延迟 |
-XX:+UseShenandoahGC | 启用Shenandoah | 布尔 | JDK12+,低暂停时间 |
G1专用参数
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:G1HeapRegionSize | Region大小 | 2的幂(1-32m) | 大堆可用大Region减少开销 |
-XX:InitiatingHeapOccupancyPercent | 触发并发标记阈值 | 百分比(默认45) | 控制标记时机 |
-XX:MaxGCPauseMillis | 目标最大暂停时间 | 毫秒(默认200) | G1核心目标参数 |
-XX:G1ReservePercent | 保留空间百分比 | 百分比(默认10) | 防止晋升失败 |
-XX:G1NewSizePercent | 年轻代最小占比 | 百分比(默认5) | 控制年轻代弹性 |
-XX:G1MaxNewSizePercent | 年轻代最大占比 | 百分比(默认60) | 控制年轻代弹性 |
CMS专用参数
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:CMSInitiatingOccupancyFraction | CMS触发阈值 | 百分比(默认68) | 预留空间避免并发失败 |
-XX:+UseCMSInitiatingOccupancyOnly | 仅用阈值触发 | 布尔 | 禁止自适应调整 |
-XX:+CMSScavengeBeforeRemark | 重新标记前YGC | 布尔 | 减少重新标记时间 |
-XX:+CMSClassUnloadingEnabled | 类卸载 | 布尔 | 动态类加载应用必须 |
-XX:+UseParNewGC | 年轻代用ParNew | 布尔 | CMS的默认年轻代收集器 |
通用GC调优
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:SurvivorRatio | Eden/Survivor比例 | 整数(默认8) | 控制对象在年轻代存活时间 |
-XX:MaxTenuringThreshold | 最大晋升阈值 | 整数(0-15) | 控制对象晋升老年代时机 |
-XX:+UseTenuringDistribution | 使用年龄分布 | 布尔 | 基于对象年龄动态调整 |
三、非堆内存配置
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:MetaspaceSize | 元空间初始大小 | 字节单位 | 替代PermGen,动态类加载应用需增大 |
-XX:MaxMetaspaceSize | 元空间最大大小 | 字节单位 | 防止元空间无限增长 |
-XX:MaxDirectMemorySize | 直接内存上限 | 字节单位 | NIO应用需设置 |
-XX:+UseCompressedOops | 压缩普通对象指针 | 布尔 | 堆<32G时默认开启 |
-XX:+UseCompressedClassPointers | 压缩类指针 | 布尔 | 64位JVM默认开启 |
四、JIT编译优化
编译器配置
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+TieredCompilation | 分层编译 | 布尔 | JDK8+默认,冷热代码区别优化 |
-XX:CICompilerCount | 编译器线程数 | 整数 | CPU密集型应用可增加 |
-XX:-UseBiasedLocking | 禁用偏向锁 | 布尔 | 高竞争或无竞争场景 |
-XX:CompileThreshold | 方法调用阈值 | 整数 | 控制JIT编译时机 |
优化技术
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+DoEscapeAnalysis | 逃逸分析 | 布尔 | 默认开启,栈上分配优化 |
-XX:+EliminateLocks | 锁消除 | 布尔 | 基于逃逸分析的锁优化 |
-XX:+UseStringDeduplication | 字符串去重 | 布尔 | 大量相同字符串的应用 |
-XX:StringDeduplicationAgeThreshold | 去重年龄阈值 | 整数 | 控制字符串去重时机 |
内在函数优化
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+UseAESIntrinsics | AES内在函数 | 布尔 | 加密解密应用 |
-XX:+UseSHA1Intrinsics | SHA内在函数 | 布尔 | 哈希计算应用 |
-XX:+UseCRC32Intrinsics | CRC32内在函数 | 布尔 | 校验和计算 |
五、诊断与监控
GC日志相关
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+PrintGCDetails | 打印GC详情 | 布尔 | 生产环境必备 |
-Xloggc:<file> | GC日志文件 | 文件路径 | 指定日志位置 |
-XX:+UseGCLogFileRotation | GC日志轮转 | 布尔 | 长期运行应用 |
-XX:NumberOfGCLogFiles | 日志文件数 | 整数 | 与轮转配合 |
-XX:GCLogFileSize | 单个日志大小 | 字节单位 | 控制日志文件大小 |
-XX:+PrintGCDateStamps | 打印日期戳 | 布尔 | 便于时间分析 |
内存诊断
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+HeapDumpOnOutOfMemoryError | OOM时堆转储 | 布尔 | 生产环境必备 |
-XX:HeapDumpPath | 堆转储路径 | 文件路径 | 指定转储文件位置 |
-XX:NativeMemoryTracking | 本地内存跟踪 | off/summary/detail | 排查内存泄漏 |
-XX:+PrintNMTStatistics | 打印NMT统计 | 布尔 | NMT详细模式时 |
性能监控
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+FlightRecorder | 启用JFR | 布尔 | 性能分析 |
-XX:StartFlightRecording | 启动JFR录制 | 参数串 | 持续性能监控 |
-XX:+PrintSafepointStatistics | 打印安全点统计 | 布尔 | 排查停顿问题 |
-XX:PrintSafepointStatisticsCount | 统计次数 | 整数 | 控制输出量 |
JMX监控
| 参数 | 作用 | 值类型 | 适用场景 |
-Dcom.sun.management.jmxremote.port | JMX端口 | 端口号 | 远程监控 |
-Dcom.sun.management.jmxremote.authenticate | JMX认证 | 布尔 | 生产环境应开启 |
-Dcom.sun.management.jmxremote.ssl | JMX SSL | 布尔 | 安全要求高的环境 |
六、运行时行为
线程与锁
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+UseSpinning | 自旋锁 | 布尔 | 多核环境下减少上下文切换 |
-XX:PreBlockSpin | 自旋次数 | 整数 | 控制自旋等待 |
-XX:+PrintConcurrentLocks | 打印并发锁 | 布尔 | 排查锁竞争 |
容器化支持
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+UseContainerSupport | 容器支持 | 布尔 | JDK8u191+容器环境必备 |
-XX:ActiveProcessorCount | 指定CPU数 | 整数 | 覆盖容器CPU限制 |
-XX:+PrintContainerStatistics | 打印容器统计 | 布尔 | 容器环境调试 |
类加载相关
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+TraceClassLoading | 跟踪类加载 | 布尔 | 排查类加载问题 |
-XX:+TraceClassUnloading | 跟踪类卸载 | 布尔 | 排查内存泄漏 |
-verbose:class | 类加载详情 | 布尔 | 简化的类加载跟踪 |
七、高级特性
AppCDS(应用类数据共享)
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+UseAppCDS | 启用AppCDS | 布尔 | 容器环境、快速启动 |
-XX:DumpLoadedClassList | 转储类列表 | 文件路径 | 生成共享存档第一步 |
-XX:SharedClassListFile | 共享类列表 | 文件路径 | 创建共享存档 |
-XX:SharedArchiveFile | 共享存档文件 | 文件路径 | 使用共享存档 |
实验性功能
| 参数 | 作用 | 值类型 | 适用场景 |
-XX:+UnlockExperimentalVMOptions | 解锁实验选项 | 布尔 | 使用实验性参数前 |
-XX:+UnlockDiagnosticVMOptions | 解锁诊断选项 | 布尔 | 使用诊断参数前 |
-XX:+UseWisp2 | 纤程(阿里) | 布尔 | 高并发网络应用 |
-XX:+EnableCoroutine | 协程支持 | 布尔 | 协程实验 |
八、组合使用场景示例
场景1:Web服务(G1收集器)
# 基础配置
-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=45
# 内存溢出诊断
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dumps
# 监控
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/to/gc.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=20m
# 容器支持
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0
# 元空间(动态类加载)
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
# 直接内存(Netty等)
-XX:MaxDirectMemorySize=1g
场景2:大数据处理(Parallel GC)
# 吞吐量优先
-Xms16g -Xmx16g
-XX:+UseParallelGC
-XX:+UseParallelOldGC
# 并行线程数(根据CPU核心)
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=4
# 年轻代配置
-XX:NewRatio=2
-XX:SurvivorRatio=8
# 关闭偏向锁(无锁竞争)
-XX:-UseBiasedLocking
# 编译优化
-XX:+AlwaysPreTouch
-XX:+UseLargePages
场景3:低延迟交易系统(ZGC)
# 低延迟配置
-Xms32g -Xmx32g
-XX:+UseZGC
# 控制停顿时间
-XX:ZCollectionInterval=5 # 每5秒强制一次
# 内存预分配
-XX:+AlwaysPreTouch
# 监控
-XX:+UnlockDiagnosticVMOptions
-XX:+ZStatistics
# 容器环境
-XX:+UseContainerSupport
-XX:+PerfDisableSharedMem
# 关闭显式GC影响
-XX:+DisableExplicitGC
场景4:微服务容器环境
# 容器感知配置
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70.0
-XX:InitialRAMPercentage=70.0
-XX:ActiveProcessorCount=2
# 内存配置
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-XX:InitiatingHeapOccupancyPercent=40
-XX:G1HeapRegionSize=4m
# 快速启动优化
-XX:+UseAppCDS
-XX:SharedArchiveFile=/app/shared.jsa
# 资源限制
-XX:MaxDirectMemorySize=256m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
# 监控精简
-XX:+PrintGCDetails
-Xloggc:/dev/stdout # 容器日志收集
九、注意事项
- 参数冲突:不能同时启用多个GC器(如UseG1GC和UseConcMarkSweepGC)
- 版本差异:部分参数在不同JDK版本中默认值或含义不同
- 顺序问题:部分参数有依赖关系,需按顺序设置
- 监控开销:诊断参数(如JFR)会产生性能开销
- 默认值优先:除非必要,不要随意修改JVM默认参数
最佳实践是从默认配置开始,通过监控发现问题,再有针对性地调整相关参数。