JVM 核心参数调优清单

JVM 核心参数调优清单

这份清单涵盖内存分配、GC 收集器、类加载、JIT 编译四大核心场景,参数均基于 HotSpot 虚拟机,可直接用于生产环境(建议先在测试环境验证)。

一、 内存分配参数(解决 OOM 核心)

内存分配是调优的基础,直接决定堆、方法区、虚拟机栈的大小,避免 OutOfMemoryError

参数 作用 推荐值(示例) 适用场景
-Xms<size> 堆初始大小(年轻代 + 老年代) -Xms2g 生产环境建议与 -Xmx 相同,避免 JVM 动态调整堆大小的性能开销
-Xmx<size> 堆最大大小 -Xmx4g 根据服务器内存配置(如 8G 内存的机器,堆最大设为 4g)
-Xmn<size> 年轻代大小(Eden + 2*Survivor) -Xmn1g 年轻代占堆的 1/3~1/2 为宜,大年轻代减少 Minor GC 次数
-XX:SurvivorRatio=<n> Eden 与 Survivor 区的比例 -XX:SurvivorRatio=8 默认 8(即 Eden:S0:S1 = 8:1:1),无需频繁调整
-XX:NewRatio=<n> 老年代与年轻代的比例 -XX:NewRatio=2 默认 2(老年代:年轻代 = 2:1),仅在未设置 -Xmn 时生效
-XX:MetaspaceSize=<size> 元空间初始大小(替代永久代) -XX:MetaspaceSize=256m 元空间存储类元数据,避免 Metaspace OOM
-XX:MaxMetaspaceSize=<size> 元空间最大大小 -XX:MaxMetaspaceSize=512m 设为 -1 表示无上限(不推荐,易占满物理内存)
-Xss<size> 每个线程的虚拟机栈大小 -Xss1m 默认 1m(64 位系统),栈太小会触发 StackOverflowError(递归深度大时需调大)

示例配置(8G 内存服务器):

bash 复制代码
java -Xms4g -Xmx4g -Xmn1g -XX:SurvivorRatio=8 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -Xss1m YourApp

二、 GC 收集器参数(提升运行效率)

选择合适的 GC 收集器,平衡吞吐量停顿时间,生产环境优先用 G1/ZGC(低停顿)。

1. 选择 GC 收集器

参数 收集器类型 适用场景 优点 缺点
-XX:+UseSerialGC 串行收集器 单核 / 小内存应用 简单高效,无线程开销 单线程回收,停顿时间长
-XX:+UseParallelGC 并行收集器(吞吐量优先) 后台服务 / 批处理任务 多线程回收,吞吐量高 停顿时间较长
-XX:+UseConcMarkSweepGC CMS 收集器(低停顿) 响应时间敏感的应用 并发回收,停顿短 占用 CPU 资源多,内存碎片多
-XX:+UseG1GC G1 收集器(平衡吞吐量 + 低停顿) 生产环境首选(JDK8+) 分区回收,可控停顿时间 配置复杂,JDK8 需调优参数
-XX:+UseZGC ZGC 收集器(超低停顿) 大内存应用(16G+) 停顿时间 <10ms,支持 TB 级内存 JDK11+ 才支持,需开启实验特性

2. GC 调优核心参数

(1)G1 收集器专属参数(生产首选)
参数 作用 推荐值
-XX:MaxGCPauseMillis=<ms> 目标最大 GC 停顿时间 -XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=<size> G1 堆分区大小(1M~32M) 让堆分区数在 2048 左右(如 4G 堆设为 2m)
-XX:InitiatingHeapOccupancyPercent=<n> 触发混合回收的堆占用阈值 -XX:InitiatingHeapOccupancyPercent=45
(2)通用 GC 日志参数(排查问题必备)
参数 作用 示例
-XX:+PrintGCDetails 打印详细 GC 日志 配合下面参数使用
-XX:+PrintGCTimeStamps 打印 GC 发生的时间戳
-XX:+PrintGCDateStamps 打印 GC 发生的具体日期时间
-Xloggc:<file-path> 将 GC 日志输出到文件 -Xloggc:/var/log/gc.log

G1 收集器完整示例

bash 复制代码
java -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/gc.log YourApp

三、 类加载参数(解决类加载冲突)

针对类加载机制的调优,适用于自定义类加载器、打破双亲委派的场景(如 Tomcat)。

参数 作用 适用场景
-XX:+TraceClassLoading 打印类加载的详细过程 排查类重复加载、类找不到问题
-XX:+TraceClassUnloading 打印类卸载的详细过程 排查元空间内存泄漏
-XX:MaxTenuringThreshold=<n> 对象晋升老年代的年龄阈值 -XX:MaxTenuringThreshold=15(默认),调小可让对象提前进入老年代
-Djava.system.class.loader=<classname> 指定系统类加载器 自定义系统类加载器时使用

排查类加载问题示例

bash 复制代码
java -XX:+TraceClassLoading -XX:+TraceClassUnloading YourApp

四、 JIT 编译参数(优化热点代码执行)

调整 JIT 编译策略,让热点代码更快被编译为机器码。

参数 作用 推荐值
-XX:CompileThreshold=<n> 方法触发 JIT 编译的调用次数阈值 -XX:CompileThreshold=10000(默认)
-XX:+TieredCompilation 开启分层编译(C1+C2 协同) JDK8+ 默认开启,无需手动配置
-XX:+PrintCompilation 打印 JIT 编译的方法信息 排查热点代码编译问题
-XX:CompileCommand=<cmd>,<class>::<method> 强制编译 / 排除指定方法 -XX:CompileCommand=compileOnly,com.example.User::getName

开启 JIT 日志示例

bash 复制代码
java -XX:+PrintCompilation -XX:+TieredCompilation YourApp

五、 调优注意事项

  1. 优先监控,再调优 :先用 jstat(监控 GC)、jmap(分析堆内存)、jstack(分析线程)定位问题,再针对性调整参数。
  2. 小步调整,对比验证:每次只改 1~2 个参数,对比调优前后的性能指标(吞吐量、停顿时间)。
  3. 生产环境禁用实验参数 :如 ZGC 在 JDK11 中是实验特性,需加 -XX:+UnlockExperimentalVMOptions,生产环境慎用。

我可以帮你整理一份 JVM 调优工具使用指南 ,包括 jstat/jmap/jstack 的常用命令和结果解读,需要吗?

相关推荐
CodeAmaz4 小时前
JVM一次完整GC流程详解
java·jvm·gc流程
笃行客从不躺平6 小时前
JVM 类加载机制复习
jvm
飞火流星020276 小时前
【Arthas工具】使用Trace命令分析Java JVM方法调用链路及耗时
java·jvm·arthas·jvm性能调优·java方法调用链路分析及耗时·jvm实时分析·jvm方法调用实时分析
7ioik6 小时前
JVM 调优工具深度指南:从监控到诊断的全流程实战
jvm
喵手6 小时前
JVM 基础知识:深入理解 Java 的运行时环境!
java·jvm·jvm基础·java运行环境
WizLC1 天前
【JAVA】JVM类加载器知识笔记
java·jvm·笔记
CodeAmaz1 天前
Java 垃圾回收(GC)算法详解
java·jvm·算法·垃圾回收算法
漫漫求1 天前
Java内存模型【JMM】、JVM内存模型
java·开发语言·jvm
dddaidai1231 天前
深入JVM(三):JVM执行引擎
java·jvm