一、内存相关参数(核心配置)
1. 堆内存
-Xms512m # 初始堆大小(默认物理内存的1/64)
-Xmx2g # 最大堆大小(默认物理内存的1/4)
-Xmn1g # 新生代大小(建议为堆的1/3~1/2)
-XX:NewRatio=2 # 老年代与新生代的比例(2表示老年代:新生代=2:1)
-XX:SurvivorRatio=8 # Eden区与Survivor区的比例(8表示Eden:Survivor=8:1:1)
2. 元空间
-XX:MetaspaceSize=64m # 初始元空间大小(触发GC的阈值)
-XX:MaxMetaspaceSize=256m # 最大元空间大小(默认无限制,建议设置)
3. 直接内存
-XX:MaxDirectMemorySize=128m # 堆外内存(NIO Direct Buffer)上限
二、GC相关参数
1. 通用GC参数
-XX:+UseSerialGC # 使用串行垃圾回收器(单线程)
-XX:+UseParallelGC # 使用并行垃圾回收器(吞吐量优先)
-XX:+UseConcMarkSweepGC # 使用CMS垃圾回收器(低延迟,JDK 8默认未启用)
-XX:+UseG1GC # 使用G1垃圾回收器(JDK 8u40+推荐)
2. Parallel GC调优
-XX:ParallelGCThreads=4 # 并行GC线程数(默认与CPU核数相同)
-XX:MaxGCPauseMillis=200 # 目标最大GC停顿时间(毫秒,G1适用)
-XX:GCTimeRatio=99 # GC时间与应用时间占比(1/(1+99)=1%)
3.CMS GC调优
-XX:CMSInitiatingOccupancyFraction=70 # 老年代使用率触发CMS GC(默认68%)
-XX:+UseCMSInitiatingOccupancyOnly # 禁止CMS自动调整触发阈值
-XX:+ExplicitGCInvokesConcurrent # System.gc()触发CMS而非Full GC
4.GC日志与诊断
-XX:+PrintGCDetails # 打印详细GC日志
-XX:+PrintGCDateStamps # 添加时间戳
-Xloggc:/path/to/gc.log # 输出GC日志到文件
-XX:+HeapDumpOnOutOfMemoryError # OOM时生成堆转储文件
-XX:HeapDumpPath=/path/to/dump.hprof # 指定堆转储路径
三、性能调优参数
1. JIT编译相关
-XX:+PrintCompilation # 打印JIT编译日志
-XX:+UnlockDiagnosticVMOptions # 启用诊断选项
-XX:+PrintInlining # 打印方法内联信息
2. 类加载跟踪
-XX:+TraceClassLoading # 跟踪类加载过程
-XX:+TraceClassUnloading # 跟踪类卸载过程
3.内存泄漏诊断
-XX:NativeMemoryTracking=summary # 开启Native内存跟踪
jcmd <pid> VM.native_memory detail # 查看Native内存详情
四、其他重要参数
1.线程栈
-Xss256k # 每个线程的栈大小(默认1MB,减少可支持更多线程)
2.系统行为
-Dfile.encoding=UTF-8 # 设置默认编码
-XX:+DisableExplicitGC # 禁止显式调用System.gc()(影响NIO堆外内存回收)
-XX:+UseLargePages # 启用大内存页(需系统支持)
3.容器化环境适配
-XX:+UseCGroupMemoryLimitForHeap # 读取Docker内存限制(JDK 8u131+)
-XX:MaxRAMPercentage=70.0 # 堆占容器内存的比例(替代-Xmx)
五、配置依据
1. 根据应用类型配置
Web应用:需要更大堆空间(-Xmx设为物理内存的50-70%)
计算密集型:关注JIT优化和适当减少堆内存
大数据处理:可能需要更大的新生代比例
2. 根据硬件资源配置
内存总量:-Xmx不超过物理内存的70%(需留空间给OS和其他进程)
CPU核心数:影响并行GC线程数(-XX:ParallelGCThreads)
3. 根据监控数据调整
GC日志分析:根据Full GC频率调整堆大小
内存溢出情况:调整Metaspace或堆大小
性能分析工具:如VisualVM、Arthas等发现的瓶颈
4. 根据JDK版本选择
JDK8:常用CMS或G1
JDK11+:推荐ZGC或Shenandoah(低延迟需求)
JDK17+:ZGC功能更成熟
六、典型配置示例
# 电商服务端配置示例(JDK17)
java -Xms8g -Xmx8g -Xmn3g \
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m \
-XX:+UseZGC -XX:+ZGenerational \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/heapdump.hprof \
-XX:+PrintGCDetails -Xlog:gc*:file=/logs/gc.log:time,uptime,level,tags:filecount=5,filesize=100m \
-jar app.jar
# 某企业配置示例(JDK8)
#! /bin/bash
export JENKINS_NODE_COOKIE=dontKillMe
nohup java \
-Dname=gcmp-coi -Duser.timezone=Asia/Shanghai \
-Xms2048m -Xmx2048m \
-XX:NewRatio=3 -XX:SurvivorRatio=8 \ # SurvivorRatio建议设为8
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m \
-XX:+UseG1GC \ # 推荐使用G1
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof \ # 改用相对路径
-Xlog:gc*,safepoint:file=./gc.log:time,uptime,level,tags:filecount=5,filesize=100m \
-jar gcmp-coi-1.0.0.jar --spring.profiles.active=test > console.log 2>&1 &
七、注意事项
生产环境务必设置-Xms和-Xmx相同,避免运行时动态调整
容器化部署时需考虑cgroup限制,使用-XX:+UseContainerSupport
参数调整后必须进行压测验证
不同JDK版本参数可能有差异(如JDK9+使用-Xlog替代-XX:+PrintGC)
合理配置JVM参数需要结合应用特点、硬件资源和实际监控数据进行动态调整,没有放之四海而皆准的最优配置。