背景

本文汇总 OpenJDK HotSpot 常用启动参数(-、-X、-XX)。这些开关 不是 JVM 规范的一部分,其他实现(OpenJ9 等)名称与语义可能不同。

JVM 生态选型见 jvm;HotSpot 架构索引见 hotspot。GC 算法细节见 java-gc;JIT 与分层编译见 hotspot-jit。

参数分类

HotSpot 命令行参数分三类:

类型 前缀 说明
标准参数 - 规范要求所有实现支持,如 -version
非标准参数 -X 实现相关,如 -Xms、-Xmx;不保证跨版本兼容
不稳定参数 -XX HotSpot 专有调优项,可能无预警变更或移除

查看当前生效的 HotSpot 参数:

java -XX:+PrintCommandLineFlags -version
java -XX:+PrintFlagsFinal -version | grep -i gc

堆与元空间

堆大小

参数 别名 说明
-Xms<size> -XX:InitialHeapSize 初始堆大小;常与 -Xmx 设相同,避免运行期扩堆
-Xmx<size> -XX:MaxHeapSize 最大堆大小
-Xmn<size> -XX:NewSize 等 年轻代大小(eden + 2×survivor);显式设置会干扰 G1 等区域自适应,现代应用更常用比例或交给 G1 自动调整

<size> 可用 k/m/g(如 -Xmx2g)。

java -Xms512m -Xmx2g MyApp

分代比例(传统分代 GC)

对 G1、ZGC 等,以下参数意义减弱或无效;主要用于 Parallel GC、CMS 等经典分代收集器:

参数 说明
-XX:NewRatio=n 年轻代 : 老年代 = 1 : n
-XX:SurvivorRatio=n Eden : 单个 Survivor = n : 1(两个 Survivor)
-XX:MaxTenuringThreshold=n 对象在 Survivor 中经历 Minor GC 的次数上限,超过则晋升老年代

元空间(JDK 8+)

JDK 8 起永久代(PermGen)移除,类元数据进入 元空间(本地内存):

参数 说明
-XX:MetaspaceSize 元空间初始阈值;达到后可能触发 GC
-XX:MaxMetaspaceSize 元空间上限

JDK 7 及更早使用 -XX:PermSize / -XX:MaxPermSize,已废弃。

堆外与直接内存

参数 说明
-XX:MaxDirectMemorySize DirectByteBuffer 等堆外内存上限

线程栈

参数 说明
-Xss<size> 每线程栈大小;-Xss 为跨实现常用写法
-XX:ThreadStackSize HotSpot 专有等价项

Linux x64 上 HotSpot 默认栈约 1MB。栈过小易 StackOverflowError;过大则同进程可创建的线程数减少。线程栈内存向 操作系统 申请,不属于 Java 堆。

对象指针压缩(64 位)

参数 说明
-XX:+UseCompressedOops 压缩普通对象指针(默认在 64 位堆 < 32GB 时常开)
-XX:+UseCompressedClassPointers 压缩类指针

垃圾收集器选择

通过 -XX:+Use...GC 选择收集器(布尔开关 不要 写 =true):

参数 收集器 备注
-XX:+UseSerialGC Serial 单线程,小堆或客户端
-XX:+UseParallelGC Parallel(吞吐优先) JDK 8 默认 Server 之一
-XX:+UseG1GC G1 JDK 9+ 默认;JDK 21+ 仍为主流选择之一
-XX:+UseZGC ZGC 低延迟;JDK 23+ 默认分代
-XX:+UseShenandoahGC Shenandoah 低延迟;JDK 25 起分代模式正式可用
-XX:+UseConcMarkSweepGC CMS JDK 14 移除,仅旧版本文档参考

并行度与停顿目标(Parallel / G1 等):

参数 说明
-XX:ParallelGCThreads=n 并行 GC 线程数
-XX:MaxGCPauseMillis=n G1 等:期望最大停顿毫秒数(启发式,非硬保证)
-XX:GCTimeRatio=n GC 时间占比目标,约 1/(1+n)

显式 GC 与 RMI:

参数 说明
-XX:+DisableExplicitGC 忽略 System.gc()
-Dsun.rmi.dgc.server.gcInterval=ms RMI 分布式 GC 间隔(默认较短,可能频繁触发 GC)

GC 日志

现代写法(JDK 9+,推荐)

统一用 Unified JVM Logging(-Xlog):

# 控制台输出 GC 详情
java -Xlog:gc*:stdout:time,uptime,level,tags MyApp

# 写入文件
java -Xlog:gc*:file=gc.log:time,uptime,level,tags MyApp

旧参数(已废弃,仅供读老日志)

旧参数 替代
-XX:+PrintGC、-verbose:gc -Xlog:gc
-XX:+PrintGCDetails -Xlog:gc*
-XX:+PrintGCTimeStamps -Xlog 的 time / uptime
-Xloggc:file -Xlog:gc*:file=...

GC 日志分析与 jstat 见 java-gc-jstat。

JIT 与编译

参数 说明
-XX:CICompilerCount=n JIT 编译器后台线程数
-XX:+TieredCompilation 分层编译(默认开启)
-XX:-TieredCompilation 关闭分层,解释器 + C2
-XX:TieredStopAtLevel=n 最高编译级别,1=C1,4=C2
-XX:+PrintCompilation 控制台打印编译事件
-XX:+LogCompilation 详细编译日志(需配合 -XX:LogFile=)
-XX:InitialCodeCacheSize 代码缓存初始大小
-XX:ReservedCodeCacheSize 代码缓存上限;满后可能降级为仅解释执行
-XX:+UseCodeCacheFlushing 代码缓存满时尝试淘汰部分已编译代码

详见 hotspot-jit。

诊断与排错

堆转储与 OOM

参数 说明
-XX:+HeapDumpOnOutOfMemoryError OOM 时自动写 heap dump
-XX:HeapDumpPath=<path> dump 文件路径

类加载日志

参数 说明
-Xlog:class+load=info 类加载日志(JDK 16+ 替代 -XX:+TraceClassLoading)

常用 JDK 工具(HotSpot)

工具 用途
jcmd <pid> VM.flags 查看生效标志
jmap -heap <pid> 堆配置与各区域使用
jstat -gcutil <pid> 1s GC 统计
jcmd <pid> GC.heap_dump 手动 heap dump

VM Thread 与 CPU 100%

VM Thread 是 HotSpot 内部线程,负责 GC 协调、部分对象分配与 safepoint 等。若 top / 线程 dump 显示 VM Thread 占满 CPU,且伴随老年代已满,常见原因是 短时间内大量对象分配 导致 GC 跟不上。思路:看 GC 日志、堆使用与分配速率,而非只盯业务线程。

典型示例

# 服务端常见起点:固定堆、G1、OOM 时 dump、GC 日志
java -Xms2g -Xmx2g \
  -XX:+UseG1GC \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/tmp/heap.hprof \
  -Xlog:gc*:file=gc.log:time,uptime,level,tags \
  -jar app.jar

调优应结合压测与 GC 日志迭代,避免照搬 JDK 5/6 时代的 -Xmn + CMS 配方。

参考

维护记录

时间 修改内容 原因
2026-07-15 更新 jvm-compiler 互链为 hotspot-jit jvm-compiler.md 更名为 hotspot-jit.md