Skip to content

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.jar

JDK 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 必须支持
非标准参数-XJVM 通用,但不保证跨版本兼容
非稳定参数-XX调优参数,最灵活也最不稳定
类别常用参数
堆内存-Xms-Xmx-Xmn-XX:NewRatio
GC 策略-XX:+UseG1GC-XX:+UseZGC
GC 日志-Xlog:gc*-XX:+PrintGCDetails
OOM 处理-XX:+HeapDumpOnOutOfMemoryError
诊断-XX:+PrintFlagsFinaljinfo

记住:优先使用标准参数和 -X 参数,-XX 参数需要明确了解其含义和影响后再使用。

下一节,我们来看 内存/GC/日志相关参数设置

基于 VitePress 构建