一、堆内存参数
1. 核心参数说明
| 参数 | 含义 | 默认值 | 调优建议 |
|---|---|---|---|
| -Xms | 初始堆大小 | 物理内存的1/64 | 与-Xmx设置为相同值,避免堆内存频繁扩展收缩 |
| -Xmx | 最大堆大小 | 物理内存的1/4 | 根据应用需求设置,建议不超过物理内存的80% |
| -Xmn | 年轻代大小 | 堆大小的1/3 | 年轻代占比1/3~1/2,对象存活率低时可适当调大 |
| -XX:SurvivorRatio | Eden区与单个Survivor区的比值 | 8(Eden:S0:S1=8:1:1) | 对象存活率高时可适当降低(如6),减少Minor GC开销 |
| -XX:MaxTenuringThreshold | 对象进入老年代的年龄阈值 | 15 | 根据对象存活时间调整,长期存活对象可提前进入老年代 |
| -XX:PretenureSizeThreshold | 直接进入老年代的对象大小 | 无(默认0,不启用) | 大对象(如10MB+)可直接进入老年代,避免复制开销 |
2. 调优原则
- 初始堆与最大堆一致 :
-Xms=-Xmx,避免堆内存扩容收缩带来的性能开销 - 年轻代大小适中:根据对象存活时间调整,对象存活率低时调大年轻代
- Survivor区比例合理:对象存活率高时降低SurvivorRatio,减少对象过早进入老年代
二、垃圾收集器参数
1. Serial收集器
- 启用参数 :
-XX:+UseSerialGC(年轻代Serial,老年代Serial Old) - 适用场景:单CPU环境、Client模式、内存较小的应用
- 核心参数:无特殊调优参数,依赖堆内存参数
2. ParNew收集器
- 启用参数 :
-XX:+UseParNewGC(年轻代ParNew,老年代需指定) - 配合CMS :
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC - 核心参数 :
-XX:ParallelGCThreads:GC线程数,默认CPU核心数- 调优建议:GC线程数设置为CPU核心数或核心数的一半(IO密集型)
3. Parallel Scavenge收集器
- 启用参数 :
-XX:+UseParallelGC(年轻代Parallel Scavenge,老年代Parallel Old) - 核心参数 :
-XX:MaxGCPauseMillis:目标最大GC停顿时间(默认200ms)-XX:GCTimeRatio:吞吐量目标,公式为1/(1+ratio)(默认99,吞吐量99%)-XX:+UseAdaptiveSizePolicy:开启自适应调节,JVM自动调整年轻代大小、SurvivorRatio等
- 调优建议:关注吞吐量,适合后台计算应用
4. CMS收集器
- 启用参数 :
-XX:+UseConcMarkSweepGC(年轻代ParNew,老年代CMS) - 核心参数 :
-XX:CMSInitiatingOccupancyFraction:老年代占用阈值,超过该值触发CMS(默认92%)-XX:+UseCMSCompactAtFullCollection:Full GC时进行内存整理,减少碎片-XX:CMSFullGCsBeforeCompaction:多少次Full GC后进行一次整理(默认0,每次都整理)-XX:+CMSParallelInitialMarkEnabled:初始标记阶段并行执行,减少STW时间
- 调优建议:低延迟场景,注意内存碎片问题,定期Full GC整理
5. G1收集器(JDK9+默认)
- 启用参数 :
-XX:+UseG1GC(默认启用) - 核心参数 :
-XX:MaxGCPauseMillis:目标最大GC停顿时间(默认200ms)-XX:G1HeapRegionSize:Region大小,2MB~32MB,默认根据堆大小自动计算-XX:InitiatingHeapOccupancyPercent:全局并发标记触发阈值(默认45%)-XX:G1NewSizePercent:年轻代最小占比(默认5%)-XX:G1MaxNewSizePercent:年轻代最大占比(默认60%)
- 调优建议 :
- 堆大小建议8GB以上
- 根据业务延迟要求调整
MaxGCPauseMillis - 避免设置固定年轻代大小(-Xmn),让G1自动调节
6. ZGC收集器(JDK11+)
- 启用参数 :
-XX:+UseZGC - 核心参数 :
-XX:ZGCHeapSizeMin:最小堆大小-XX:ZGCHeapSizeMax:最大堆大小-XX:ZGCParallelGCThreads:GC线程数(默认CPU核心数)-XX:ZGCConcurrency:并发线程数比例(默认1/8)
- 调优建议:适合超大堆内存(TB级),对延迟要求极高的场景
三、元空间参数
1. 核心参数说明
| 参数 | 含义 | 默认值 | 调优建议 |
|---|---|---|---|
| -XX:MetaspaceSize | 元空间初始大小,触发Full GC的阈值 | 依赖平台(如21MB) | 设置为日常使用的最大值,避免频繁Full GC |
| -XX:MaxMetaspaceSize | 元空间最大大小 | 无限制(依赖本地内存) | 根据应用类加载情况设置上限,防止内存溢出 |
| -XX:MinMetaspaceFreeRatio | 元空间扩容后,空闲空间占比低于该值时继续扩容 | 40% | 调整元空间扩容策略,减少扩容频率 |
| -XX:MaxMetaspaceFreeRatio | 元空间扩容后,空闲空间占比高于该值时释放内存 | 70% | 调整元空间释放策略,避免内存浪费 |
2. 元空间与永久代的区别
| 对比维度 | 元空间(JDK8+) | 永久代(JDK7及之前) |
|---|---|---|
| 内存位置 | 本地内存(Native Memory) | JVM堆内存 |
| 内存大小 | 默认无限制,可通过MaxMetaspaceSize限制 | 受JVM堆大小限制,默认较小 |
| GC触发 | 仅在元空间不足时触发 | 与堆GC一起触发,影响性能 |
| 存储内容 | 类元数据、常量池、静态变量(JDK8后静态变量移至堆) | 类元数据、常量池、静态变量 |
| OOM类型 | java.lang.OutOfMemoryError: Metaspace |
java.lang.OutOfMemoryError: PermGen space |
| 调优复杂度 | 较低,主要调整初始大小和最大值 | 较高,需平衡堆内存和永久代大小 |
四、其他调优参数(调试与监控)
1. GC日志参数
| 参数 | 含义 | 调优建议 |
|---|---|---|
| -XX:+PrintGCDetails | 打印详细GC日志 | 生产环境建议开启,便于分析GC问题 |
| -XX:+PrintGCDateStamps | 打印GC发生的时间戳 | 配合PrintGCDetails使用,便于定位问题时间点 |
| -XX:+PrintHeapAtGC | 打印GC前后的堆内存使用情况 | 分析内存变化趋势,调整堆大小 |
| -Xloggc:/path/to/gc.log | 将GC日志输出到指定文件 | 生产环境建议输出到文件,避免控制台输出影响性能 |
| -XX:+UseGCLogFileRotation | 启用GC日志文件滚动 | 防止日志文件过大,设置合理的滚动策略 |
| -XX:NumberOfGCLogFiles=5 | 保留GC日志文件数量 | 建议保留5~10个文件 |
| -XX:GCLogFileSize=100M | 单个GC日志文件大小 | 建议100MB~500MB,根据应用GC频率调整 |
2. 内存诊断参数
| 参数 | 含义 | 调优建议 |
|---|---|---|
| -XX:+HeapDumpOnOutOfMemoryError | OOM时自动生成堆转储文件 | 生产环境必须开启,便于分析内存泄漏 |
| -XX:HeapDumpPath=/path/to/dump.hprof | 堆转储文件保存路径 | 设置到有足够空间的目录,避免磁盘不足 |
| -XX:+PrintHeapDumpOnOutOfMemoryError | OOM时打印堆转储信息 | 配合HeapDumpOnOutOfMemoryError使用,增强诊断信息 |
| -XX:OnOutOfMemoryError="command" | OOM时执行指定命令 | 如发送告警邮件、重启应用等,应急处理 |
3. 性能监控参数
| 参数 | 含义 | 调优建议 |
|---|---|---|
| -XX:+TraceClassLoading | 打印类加载信息 | 调试类加载问题,如类冲突、类重复加载 |
| -XX:+TraceClassUnloading | 打印类卸载信息 | 调试类卸载问题,如类加载器泄漏 |
| -XX:+PrintCompilation | 打印JIT编译信息 | 分析热点方法编译情况,优化代码 |
| -XX:+PrintInlining | 打印方法内联信息 | 分析JIT内联情况,优化方法调用 |
五、调优参数使用示例
1. 基础调优示例(Web应用,8GB物理内存)
bash
java -Xms4G -Xmx4G -Xmn1G -XX:SurvivorRatio=8 -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/dump.hprof -jar app.jar
2. G1调优示例(大堆应用,16GB物理内存)
bash
java -Xms12G -Xmx12G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=8M -XX:InitiatingHeapOccupancyPercent=45 -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=50 -XX:+PrintGCDetails -Xloggc:/logs/gc.log -jar app.jar
3. CMS调优示例(低延迟应用)
bash
java -Xms4G -Xmx4G -Xmn1G -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5 -XX:+PrintGCDetails -jar app.jar
六、JVM调优一般步骤
- 监控GC日志:开启GC日志,分析GC频率、停顿时间、内存使用情况
- 分析内存泄漏:使用HeapDumpOnOutOfMemoryError生成堆转储,通过MAT等工具分析内存泄漏
- 调整堆内存参数:根据GC日志调整-Xms、-Xmx、-Xmn等参数
- 选择合适的垃圾收集器:根据应用特性选择Serial、Parallel、CMS、G1或ZGC
- 优化垃圾收集器参数:调整收集器特定参数,如G1的MaxGCPauseMillis、CMS的CMSInitiatingOccupancyFraction
- 验证调优效果:重新启动应用,监控GC日志,比较调优前后的性能变化
- 持续监控与调整:定期分析GC日志,根据应用负载变化调整参数
七、调优注意事项
- 避免过度调优:参数调整应基于实际监控数据,而非盲目猜测
- 关注业务指标:调优目标应与业务指标一致(如延迟、吞吐量、内存使用率)
- 测试环境验证:新参数应在测试环境验证后再应用到生产环境
- 记录调优过程:保存每次调优的参数和效果,便于回溯和对比
- 适应应用生命周期:应用不同阶段(开发、测试、生产)的调优参数可能不同
总结
JVM调优参数配置是优化Java应用性能的重要手段,需要根据应用特性、硬件资源和业务需求灵活调整。核心调优方向包括:
- 堆内存优化:合理设置初始堆、最大堆和年轻代大小
- 垃圾收集器选择:根据延迟或吞吐量需求选择合适的收集器
- 元空间管理:避免元空间OOM,合理设置初始大小和最大值
- 监控与诊断:开启GC日志和堆转储,便于问题排查
通过持续监控和迭代调整,可以使JVM处于最佳运行状态,提高应用的性能和稳定性。