詹学伟
詹学伟
Published on 2024-06-09 / 42 Visits
0
0

JVM常用启动参数及配置依据

一、内存相关参数(核心配置)

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 &

七、注意事项

  1. 生产环境务必设置-Xms和-Xmx相同,避免运行时动态调整

  2. 容器化部署时需考虑cgroup限制,使用-XX:+UseContainerSupport

  3. 参数调整后必须进行压测验证

  4. 不同JDK版本参数可能有差异(如JDK9+使用-Xlog替代-XX:+PrintGC)

合理配置JVM参数需要结合应用特点、硬件资源和实际监控数据进行动态调整,没有放之四海而皆准的最优配置。


Comment