一、堆内存参数
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处于最佳运行状态,提高应用的性能和稳定性。