JVM 学习资料

64 阅读5分钟

JVM_OPTS(或 JAVA_OPTS)是设置 Java 虚拟机启动参数的环境变量,用于配置内存分配、垃圾回收、性能调优、日志输出等核心功能。以下按分类结构化呈现,所有参数均采用每个参数独占一行的格式化输出,便于直接复制使用。

一、参数分类与基础规则

JVM 参数分为三类,核心区别在于稳定性与兼容性:

类型格式稳定性示例
标准参数无前缀最稳定,跨版本兼容-server、-version、-Dkey=value
非标准参数-X 开头较稳定,可能版本变更-Xms、-Xmx、-Xmn
高级参数-XX: 开头不稳定,用于调优-XX:+UseG1GC、-XX:MaxGCPauseMillis=200

基础规则

  • 布尔型参数:-XX:+<option> 启用,-XX:-<option> 禁用
  • 数值型参数:-XX:<option>=<value>,单位支持 k/K (KB)、m/M (MB)、g/G (GB)
  • 字符串参数:-XX:<option>=<string>,如日志文件路径
  • 系统属性:-Dkey=value,应用可通过System.getProperty("key")获取

二、核心内存配置参数(必配)

1、堆内存参数

# 初始堆大小(建议与-Xmx相同,避免动态扩容开销)
-Xms2g

# 最大堆大小(生产环境建议为物理内存的1/2~1/3,容器环境70-80%)
-Xmx2g

# 新生代大小(等价于-XX:NewSize和-XX:MaxNewSize)
-Xmn512m

# 老年代与新生代比例(默认2:1,仅当未设置-Xmn时生效)
-XX:NewRatio=2

# 新生代中Eden区与Survivor区比例(默认8:1)
-XX:SurvivorRatio=8

# 堆内存溢出时导出堆转储文件
-XX:+HeapDumpOnOutOfMemoryError

# 堆转储文件路径
-XX:HeapDumpPath=/var/log/app/heapdump.hprof

2、 非堆内存参数

# 初始元空间大小(JDK8+,替代永久代)
-XX:MetaspaceSize=256m

# 最大元空间大小(防止元空间溢出)
-XX:MaxMetaspaceSize=512m

# 压缩类空间最大大小
-XX:MaxCompressedClassSpaceSize=256m

# 线程栈大小(影响最大线程数,默认1m)
-Xss1m

三、垃圾回收器配置参数

1、GC 收集器选择

# 使用G1收集器(JDK9+默认,推荐生产环境)
-XX:+UseG1GC

# 使用ZGC收集器(低延迟,JDK11+)
-XX:+UseZGC

# 使用Shenandoah收集器(低延迟,OpenJDK)
-XX:+UseShenandoahGC

# 使用Parallel收集器(吞吐量优先,JDK8默认)
-XX:+UseParallelGC

# 使用CMS收集器(低停顿,JDK9已废弃)
-XX:+UseConcMarkSweepGC

2、G1 收集器调优参数

# 目标最大GC停顿时间(毫秒,默认200)
-XX:MaxGCPauseMillis=100

# 触发Mixed GC的堆占用比例(默认45%)
-XX:InitiatingHeapOccupancyPercent=40

# 预留内存比例(防止晋升失败,默认10%)
-XX:G1ReservePercent=15

# 混合回收时Old区的最大占用比例(默认85%)
-XX:G1MixedGCLiveThresholdPercent=80

# 混合回收的最大次数(默认8)
-XX:G1MixedGCCountTarget=10

3、ZGC 调优参数

# ZGC堆最大大小(默认与-Xmx相同)
-XX:ZAllocationSpikeTolerance=5

# ZGC并发线程数比例(默认1/8)
-XX:ZConcGCThreads=4

四、GC 日志与监控参数

# 启用GC详细日志输出
-XX:+PrintGCDetails

# 输出GC时间戳(日期格式)
-XX:+PrintGCDateStamps

# 指定GC日志文件路径
-Xloggc:/var/log/app/gc.log

# 日志文件滚动,保留5个文件,每个最大100MB
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=100M

# 打印GC停顿时间分布
-XX:+PrintGCTimeStamps

# 打印GC前后的内存使用情况
-XX:+PrintHeapAtGC

# 启用JVM监控(JMX)
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

五、性能调优与 JIT 参数

# 启用服务器模式(默认64位JVM启用)
-server

# 禁用显式GC(禁止System.gc()触发Full GC)
-XX:+DisableExplicitGC

# 对象晋升到老年代的年龄阈值(默认15)
-XX:MaxTenuringThreshold=10

# 直接进入老年代的对象大小(默认0,不启用)
-XX:PretenureSizeThreshold=10485760

# 启用压缩指针(64位JVM默认启用,节省内存)
-XX:+UseCompressedOops

# 启用压缩类指针
-XX:+UseCompressedClassPointers

# JIT编译阈值(默认10000)
-XX:CompileThreshold=10000

# 方法内联阈值(默认35)
-XX:InlineSmallCode=2000

六、容器环境适配参数(K8s/Docker)

# 启用容器内存感知(JDK10+)
-XX:+UseContainerSupport

# 容器内存限制(配合cgroup)
-XX:MaxRAMPercentage=75.0

# 容器CPU限制感知
-XX:ActiveProcessorCount=4

# 禁用UseContainerSupport(兼容旧版本)
-XX:-UseContainerSupport

七、常见应用场景配置模板

4 核 8G 服务器通用配置

export JVM_OPTS="
-server
-Xms4g
-Xmx4g
-Xmn1g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=40
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/app/heapdump.hprof
-Xloggc:/var/log/app/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=100M
-XX:+DisableExplicitGC
-Xss512k
"

微服务轻量配置(2 核 4G)

export JVM_OPTS="
-server
-Xms1g
-Xmx1g
-Xmn512m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/app/heapdump.hprof
-Xloggc:/var/log/app/gc.log
-XX:+PrintGCDateStamps
-XX:+DisableExplicitGC
-Xss256k
"

高并发低延迟应用(ZGC)

export JVM_OPTS="
-server
-Xms8g
-Xmx8g
-XX:+UseZGC
-XX:ZAllocationSpikeTolerance=5
-XX:ZConcGCThreads=8
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/app/heapdump.hprof
-Xlog:gc*:/var/log/app/gc.log:time,uptime:filecount=5,filesize=100M
-XX:+DisableExplicitGC
"

八、配置方法与注意事项

配置方法

# Linux/macOS设置环境变量
export JVM_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC"

# Windows设置环境变量
set JVM_OPTS=-Xms2g -Xmx2g -XX:+UseG1GC

# 直接命令行启动
java $JVM_OPTS -jar myapp.jar

# Tomcat配置(修改bin/catalina.sh)
CATALINA_OPTS="$JVM_OPTS"

注意事项

1. 内存参数合理设置

  • -Xms-Xmx 建议设为相同值,避免 JVM 动态调整堆大小带来的性能开销
  • 堆内存不宜超过物理内存的 1/2,避免操作系统内存交换
  • 新生代大小建议为堆内存的 1/4~1/2

2. GC 收集器选择

  • JDK8:优先 ParallelGC(吞吐量优先)或 CMS(低延迟)
  • JDK11+:优先 G1GC(平衡吞吐量与延迟),追求极致低延迟选 ZGC/Shenandoah

3. 监控与排障

  • 必配 GC 日志与 OOM 自动 dump,便于问题排查
  • 生产环境建议启用 JMX 监控,实时监控 JVM 状态

4. 容器环境适配

  • JDK10 + 必须启用-XX:+UseContainerSupport,否则 JVM 无法感知容器内存限制
  • 使用-XX:MaxRAMPercentage替代固定-Xmx,提高容器部署灵活性

九、常用 JVM 参数查询命令

# 查看JVM版本信息
java -version

# 查看所有标准参数
java -help

# 查看所有非标准参数
java -X

# 查看JVM支持的XX参数
java -XX:+PrintFlagsFinal -version | grep <keyword>

# 查看当前JVM运行参数(进程PID)
jinfo -flags <pid>