JVM 参数类型(标准/-X/-XX)
JVM 参数:调优的武器库
JVM 参数是调优的核心武器。但面对数百个参数,很多人无从下手。这一节系统梳理 JVM 参数的分类和使用方法。
三类 JVM 参数
JVM 参数分为三类,从稳定性由强到弱:
┌────────────────────────────────────────────────────────────┐
│ JVM 参数分类 │
├──────────────┬─────────────────┬──────────────────────────┤
│ 标准参数 │ 非标准参数 │ 非稳定参数 │
│ (Stable) │ (-X) │ (-XX) │
├──────────────┼─────────────────┼──────────────────────────────┤
│ 稳定性最强 │ 可能在 │ 不保证稳定 │
│ 未来版本 │ 不同 JVM │ 随时可能 │
│ 可能变化 │ 实现间变化 │ 移除或改变 │
└──────────────┴─────────────────┴──────────────────────────────┘第一类:标准参数(- 开头的参数)
标准参数是 JVM 规范的组成部分,所有 JVM 实现都必须支持:
bash
# 查看所有标准参数
java -help
# 查看所有标准参数(含高级选项)
java -X
# 示例标准参数:
java -version # 显示版本
java -jar xxx.jar # 运行 JAR 包
java -cp .:lib/* # 指定类路径
java -Dkey=value # 设置系统属性
java -ea # 开启断言(enable assertions)
java -da # 关闭断言(disable assertions)
java -showversion # 显示版本后继续执行第二类:非标准参数(-X 开头的参数)
非标准参数是 JVM 的通用选项,但不保证所有 JVM 实现都支持:
bash
# 查看所有 -X 参数
java -X
# 常用 -X 参数:
# 堆内存相关
-Xms256m # 初始堆大小(等价于 -XX:InitialHeapSize=256m)
-Xmx1024m # 最大堆大小(等价于 -XX:MaxHeapSize=1024m)
-Xmn256m # 年轻代大小(等价于 -XX:NewSize=MaxNewSize=256m)
-Xss512k # 线程栈大小(等价于 -XX:ThreadStackSize=512k)
# GC 日志相关
-Xloggc:/path/to/gc.log # GC 日志文件
-Xprof # 开启 CPU 分析(已过时,推荐使用 JFR)
-Xshare:on # 使用共享类数据
-Xshare:auto # 自动使用共享类数据
-Xverify:none # 跳过字节码验证(加快启动)
# 其他
-Xmixed # 混合模式执行(解释+JIT)
-Xint # 纯解释模式(慢,不推荐)
-Xcomp # 纯编译模式(启动慢)第三类:非稳定参数(-XX 开头的参数)
-XX 参数是 JVM 的调优参数,最强大也最不稳定:
bash
# -XX 参数的使用形式:
# 布尔参数(开启/关闭)
-XX:+<option> # 开启 option
-XX:-<option> # 关闭 option
# 键值参数
-XX:<option>=<value> # 设置 option 为 value
# 示例:
-XX:+UseG1GC # 开启 G1 GC
-XX:-UseStringDeduplication # 关闭字符串去重
-XX:MaxGCPauseMillis=200 # 最大 GC 停顿时间 200ms
-XX:+HeapDumpOnOutOfMemoryError # OOM 时生成堆转储常用 -XX 参数分类
内存相关
bash
# 堆内存
-XX:InitialHeapSize=1g # 初始堆大小
-XX:MaxHeapSize=4g # 最大堆大小
-XX:NewSize=256m # 年轻代初始大小
-XX:MaxNewSize=512m # 年轻代最大大小
-XX:NewRatio=2 # 老年代/年轻代比例(默认 2)
-XX:SurvivorRatio=8 # Eden/Survivor 比例(默认 8)
-XX:MinHeapFreeRatio=40 # 最小空闲比例
-XX:MaxHeapFreeRatio=70 # 最大空闲比例
# 元空间(JDK 8+,替代永久代)
-XX:MetaspaceSize=256m # 元空间初始大小
-XX:MaxMetaspaceSize=512m # 元空间最大大小
-XX:CompressedClassSpaceSize=1g # 压缩类空间大小(JDK 8)
# 直接内存(NIO 使用)
-XX:MaxDirectMemorySize=1g # 最大直接内存GC 相关
bash
# GC 选择
-XX:+UseSerialGC # Serial GC(单线程,适用于小内存)
-XX:+UseParallelGC # Parallel GC(多线程,关注吞吐量)
-XX:+UseConcMarkSweepGC # CMS GC(并发标记清除,已废弃)
-XX:+UseG1GC # G1 GC(JDK 9+ 默认)
-XX:+UseZGC # ZGC(JDK 11+,低延迟)
-XX:+UseShenandoahGC # Shenandoah GC(低延迟)
# G1 GC 专用
-XX:MaxGCPauseMillis=200 # 最大停顿目标
-XX:G1HeapRegionSize=4m # Region 大小(1MB~32MB)
-XX:InitiatingHeapOccupancyPercent=45 # 触发 Mixed GC 的阈值
-XX:G1ReservePercent=10 # 预留空间比例
# Parallel GC 专用
-XX:ParallelGCThreads=8 # GC 线程数
-XX:MaxTenuringThreshold=15 # 最大晋升年龄
# ZGC 专用
-XX:ZCollectionInterval=120 # GC 间隔(秒)
-XX:ZAllocationSpikeTolerance=3 # 分配高峰容忍度
-XX:SoftMaxHeapSize=4g # 软上限性能相关
bash
# JIT 编译
-XX:+TieredCompilation # 开启分层编译(JDK 7+)
-XX:TieredStopAtLevel=1 # 停止在哪个层次(1=简单 JIT)
-XX:CompileThreshold=10000 # 方法调用次数触发 JIT
# 类加载
-XX:+ClassUnloading # 允许类卸载(默认开启)
-XX:ClassUnloadingWithConcurrentMark=true # CMS 下类卸载
# 线程
-XX:ThreadStackSize=512 # 线程栈大小
-XX:+UseThreadPriorities # 使用线程优先级
-XX:PreTouchTaskStackSize=10 # 预触碰线程栈
# 大页内存
-XX:+UseLargePages # 使用大页
-XX:LargePageSizeInBytes=4m # 大页大小诊断相关
bash
# OOM 处理
-XX:+HeapDumpOnOutOfMemoryError # OOM 时生成堆转储
-XX:HeapDumpPath=/path/to/dumps # 堆转储文件路径
-XX:+ExitOnOutOfMemoryError # OOM 时退出 JVM
# GC 日志
-XX:+PrintGCDetails # 打印 GC 详细信息
-XX:+PrintGCDateStamps # 打印 GC 时间戳
-XX:+PrintGCTimeStamps # 打印 GC 时间戳(相对时间)
-XX:+PrintGCApplicationStoppedTime # 打印 GC 停顿时间
-XX:+PrintTenuringDistribution # 打印对象晋升信息
-Xloggc:/path/to/gc.log # GC 日志文件
# OOP 压缩
-XX:+UseCompressedOops # 开启对象指针压缩(JDK 8 64 位默认开启)
-XX:+UseCompressedClassPointers # 开启类指针压缩商用水印(需要商业许可证)
bash
# 这些参数需要 -XX:+UnlockCommercialFeatures 开启
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder # 开启 JFR
-XX:FlightRecorderOptions=settings=profile # JFR 配置查看 JVM 参数
查看 JVM 默认参数
bash
# 查看所有已生效的 JVM 参数
java -XX:+PrintFlagsFinal -version 2>&1 | head -20
# 只查看堆相关参数
java -XX:+PrintFlagsFinal -version 2>&1 | grep Heap
# 查看当前运行进程的 JVM 参数
jinfo -flags <pid>查看 JVM 参数的当前值
bash
# 查看指定参数
jinfo -flag MaxHeapSize <pid>
jinfo -flag UseG1GC <pid>
jinfo -flag PrintGCDetails <pid>
# 查看所有参数
jinfo -flags <pid>查看参数的有效值范围
bash
# 查看参数的范围
java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxGCPauseMillis
# 输出:
# size_t MaxGCPauseMillis = 200 {product}
# ↑
# 当前值 200参数组合示例
低延迟应用(推荐 G1/ZGC)
bash
java -Xmx4g -Xms4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=100 \
-XX:+ParallelRefProcEnabled \
-XX:+UnlockCommercialFeatures \
-XX:+FlightRecorder \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/myapp \
-Xlog:gc*:file=/var/log/myapp/gc.log:time,uptime,level,tags \
-jar myapp.jar高吞吐量应用(推荐 Parallel GC)
bash
java -Xmx8g -Xms8g \
-XX:+UseParallelGC \
-XX:ParallelGCThreads=16 \
-XX:+UseAdaptiveSizePolicy \
-XX:MaxGCPauseMillis=500 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/myapp \
-Xlog:gc:/var/log/myapp/gc.log:time \
-jar myapp.jar容器环境(资源受限)
bash
java -XX:+UseContainerSupport \
-XX:MaxRAMPercentage=75.0 \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+UnlockCommercialFeatures \
-XX:+FlightRecorder \
-jar myapp.jarJDK 17+ 使用 ZGC
bash
java -Xmx4g -Xms4g \
-XX:+UseZGC \
-XX:+ZGenerational \
-XX:MaxHeapSize=4g \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/myapp \
-Xlog:gc:/var/log/myapp/gc.log:time \
-jar myapp.jar参数优先级
同一参数有多种设置方式,优先级如下:
命令行参数 > 环境变量 > 配置文件 > 默认值
示例:
# 命令行
java -XX:MaxHeapSize=2g -jar app.jar
# 环境变量
export _JAVA_OPTIONS="-XX:MaxHeapSize=2g"
java -jar app.jar
# 配置文件($JAVA_HOME/conf/java.options)本节小结
JVM 参数分类速查:
| 分类 | 前缀 | 稳定性 | 说明 |
|---|---|---|---|
| 标准参数 | - | 高 | 所有 JVM 必须支持 |
| 非标准参数 | -X | 中 | JVM 通用,但不保证跨版本兼容 |
| 非稳定参数 | -XX | 低 | 调优参数,最灵活也最不稳定 |
| 类别 | 常用参数 |
|---|---|
| 堆内存 | -Xms、-Xmx、-Xmn、-XX:NewRatio |
| GC 策略 | -XX:+UseG1GC、-XX:+UseZGC |
| GC 日志 | -Xlog:gc*、-XX:+PrintGCDetails |
| OOM 处理 | -XX:+HeapDumpOnOutOfMemoryError |
| 诊断 | -XX:+PrintFlagsFinal、jinfo |
记住:优先使用标准参数和 -X 参数,-XX 参数需要明确了解其含义和影响后再使用。
下一节,我们来看 内存/GC/日志相关参数设置。
