Skip to content

06.1 - JVM参数分类速查

定位: JVM有1000+参数,这是按功能分类的生产可用参数速查表,不是按字母排序的废话手册 面试高频度: ⭐⭐⭐⭐

一、为什么需要这个页面?

JVM有超过1000个-XX参数,但生产环境中90%的问题只用得到其中约30个。按字母排序的完整参数列表没有意义——你需要的是按场景分类的速查表:

  • 遇到OOM → 看内存参数 + dump参数
  • 需要选GC → 看GC参数
  • 排查性能 → 看诊断参数
  • JIT问题 → 看编译参数

二、核心参数分类

2.1 堆内存参数

参数默认值含义使用场景面试频率
-Xms1/64物理内存初始堆大小设为与-Xmx相同,避免扩容开销⭐⭐⭐⭐⭐
-Xmx1/4物理内存最大堆大小生产建议: 不超过物理内存的70%⭐⭐⭐⭐⭐
-Xmn1/3堆新生代大小调优重点: GC频率和时间的主要关联参数⭐⭐⭐⭐⭐
-XX:NewRatio2 (Old:Young=2:1)老年代:新生代比例控制代空间比例⭐⭐⭐
-XX:SurvivorRatio8 (Eden:Survivor=8:1)Eden:Survivor比例默认8:1:1,增大可减少晋升⭐⭐⭐⭐
-XX:MaxTenuringThreshold6/15 (G1:15,CMS:6)最大晋升阈值增大可减少过早晋升⭐⭐⭐⭐
-XX:+UseAdaptiveSizePolicytrue自适应大小调整Parallel GC默认开启⭐⭐⭐

🔑 关键原则: -Xms-Xmx设为相同值,避免运行时动态扩缩带来的性能损失。-Xmn的设置直接影响Minor GC频率和晋升速度——新生代越大,Minor GC越少,但老年代空间越小。

2.2 元空间参数

参数默认值含义使用场景面试频率
-XX:MetaspaceSize约21MB元空间初始大小(触发Full GC的阈值)设为较大的值,减少元空间扩容触发的GC⭐⭐⭐⭐
-XX:MaxMetaspaceSize无限制最大元空间大小必须设置!防止类加载泄漏耗尽内存⭐⭐⭐⭐
-XX:MinMetaspaceFreeRatio40GC后元空间最小空闲比例扩容灵敏度控制⭐⭐

🔑 关键原则: MetaspaceSize不是初始分配大小,而是触发元空间GC的阈值。设得太小(默认21MB)会导致频繁元空间GC。生产建议设为256MB+。

2.3 直接内存参数

参数默认值含义使用场景面试频率
-XX:MaxDirectMemorySize等于-Xmx最大直接内存NIO/Netty应用必须设置⭐⭐⭐
-XX:+DisableExplicitGCfalse禁用System.gc()防止DirectByteBuffer被GC误触发⭐⭐⭐

🔑 关键原则: DirectByteBuffer的回收依赖System.gc()触发的Reference Handler,所以-XX:+DisableExplicitGC后,DirectByteBuffer只能等堆外内存耗尽后抛出OOM。需要使用-XX:MaxDirectMemorySize明确限制。

2.4 GC参数

GC选择

参数含义适用场景面试频率
-XX:+UseSerialGCSerial + Serial Old单核/小堆/客户端⭐⭐
-XX:+UseParallelGCParallel Scavenge + Parallel Old吞吐量优先(批处理/数仓)⭐⭐⭐⭐
-XX:+UseConcMarkSweepGCParNew + CMS低延迟优先(已废弃)⭐⭐⭐⭐⭐
-XX:+UseG1GCG1默认GC,兼顾吞吐量和延迟(JDK9+)⭐⭐⭐⭐⭐
-XX:+UseZGCZGC亚毫秒暂停(JDK15+)⭐⭐⭐
-XX:+UseShenandoahGCShenandoah低暂停(JDK12+)⭐⭐

GC调优

参数默认值含义使用场景
-XX:ParallelGCThreadsCPU核数并行GC线程数多核系统适量减少
-XX:ConcGCThreadsParallelGCThreads * 2/3 (G1: 1/4)并发GC线程数控制并发标记开销
-XX:G1HeapRegionSize1-32MB (自动)G1 Region大小控制Region数(建议2048左右)
-XX:MaxGCPauseMillis200ms目标最大GC暂停G1/CMS的暂停目标
-XX:GCTimeRatio99GC时间占总时间目标(1/(1+99)=1%)吞吐量目标
-XX:+UseAdaptiveSizePolicytrue自适应代大小调整Parallel GC专用
-XX:InitiatingHeapOccupancyPercent45 (G1)G1启动并发标记的堆占用率G1触发周期控制

2.5 GC日志参数

参数含义说明
-verbose:gc简要GC日志JDK 8+的统一方式
-Xloggc:<file>GC日志文件通常与下面参数配合
-XX:+PrintGCDetails详细GC日志JDK 8及之前使用
-XX:+PrintGCDateStamps打印日期时间戳便于与业务日志关联
-XX:+PrintGCTimeStamps打印JVM启动后时间分析GC间隔
-XX:+PrintHeapAtGCGC前后堆信息详细分析
-XX:+PrintTenuringDistribution晋升年龄分布调优Survivor
-XX:+PrintReferenceGC引用处理耗时分析Reference处理瓶颈
-XX:+PrintAdaptiveSizePolicy自适应调整决策了解GC的策略变化

JDK 9+ 统一方式:

-Xlog:gc*:file=gc.log:time,level,tags

JDK 9+统一使用-Xlog语法。GC日志参数变了,排查思维不变。

2.6 OOM诊断参数

参数含义必配指数
-XX:+HeapDumpOnOutOfMemoryErrorOOM时自动dump堆⭐⭐⭐⭐⭐ 每个Java应用必配
-XX:HeapDumpPath=<path>dump文件路径⭐⭐⭐⭐⭐
-XX:+PrintClassHistogramAfterFullGCFull GC后打印类直方图⭐⭐⭐
-XX:OnOutOfMemoryError=<cmd>OOM时执行命令⭐⭐⭐
-XX:+ExitOnOutOfMemoryErrorOOM时退出JVM⭐⭐⭐
-XX:+CrashOnOutOfMemoryErrorOOM时生成crash文件⭐⭐

2.7 编译参数

参数默认值含义使用场景
-XX:TieredStopAtLevel4 (开启C2)分层编译最高层级关闭C2: -XX:TieredStopAtLevel=1
-XX:+PrintCompilationfalse打印方法编译日志排查JIT问题
-XX:ReservedCodeCacheSize240MBCode Cache最大大小代码量大时增大
-XX:InitialCodeCacheSize约160KBCode Cache初始大小一般不动
-XX:+PrintCodeCachefalse打印Code Cache使用率Code Cache满则JIT不再生效
-XX:+UseCounterDecaytrueJIT计数器衰减避免不常用方法编译
-XX:-BackgroundCompilationtrue后台编译(不会阻塞)关闭后编译线程阻塞执行

2.8 线程参数

参数默认值含义使用场景
-Xss1MB (Linux x64)线程栈大小减少可增线程数,过大消耗内存
-XX:ThreadStackSize同上同上(单位KB)-Xss的等效参数
-XX:ActiveProcessorCountCPU数JVM看到的CPU数容器环境覆盖OS检测

2.9 其他重要参数

参数默认值含义使用场景
-XX:+DisableExplicitGCfalse禁用System.gc()防止NIO框架显式GC
-XX:+UseCompressedOopstrue压缩对象指针(32位)堆<32GB时开启,减少内存浪费
-XX:+UseCompressedClassPointerstrue压缩类指针依赖于UseCompressedOops
-XX:+AlwaysPreTouchfalse启动时预分配物理内存减少运行时缺页中断
-XX:LargePageSizeInBytes0(自动)大页大小启用大页提升TLB命中率
-XX:+UseLargePagesfalse使用大页需要OS配置大页

三、生产环境推荐参数模板

4C8G 微服务

bash
-Xms4g -Xmx4g -Xmn2g
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m
-XX:+UseG1GC -XX:MaxGCPauseMillis=100
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/
-XX:+DisableExplicitGC
-XX:+PrintGCDetails -Xloggc:/data/gc.log -XX:+PrintGCDateStamps
-XX:+UseCompressedOops

8C16G 在线服务

bash
-Xms8g -Xmx8g -Xmn4g
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m
-XX:+UseG1GC -XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=4m
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/
-XX:+DisableExplicitGC
-XX:+PrintGCDetails -Xloggc:/data/gc.log -XX:+PrintGCDateStamps
-XX:+UseCompressedOops

16C32G 批处理(吞吐量优先)

bash
-Xms16g -Xmx16g -Xmn8g
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m
-XX:+UseParallelGC -XX:ParallelGCThreads=8
-XX:+UseParallelOldGC
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/
-XX:+DisableExplicitGC
-XX:+PrintGCDetails -Xloggc:/data/gc.log -XX:+PrintGCDateStamps

四、调试/查看参数

运行时查看已生效参数

bash
jinfo -flags <pid>                          # 查看所有非默认参数
jinfo -flag <param_name> <pid>              # 查看单个参数值
jinfo -flag +HeapDumpAfterFullGC <pid>      # 动态开启(仅manageable参数)

查看JVM所有参数的默认值:

bash
java -XX:+PrintFlagsFinal -version          # 所有参数及最终值
java -XX:+PrintFlagsInitial -version        # 仅原始默认值
java -XX:+PrintCommandLineFlags -version    # 仅命令行指定的参数

PrintFlagsFinal是最常使用的——它能显示当前所有参数的实际值,包括隐式推断的值。

五、面试视角

面试题考察点回答要点
"-Xms和-Xmx有什么区别?为什么要设一样?"基础理解避免动态扩缩的内存分配和GC开销
"-Xmn的作用是什么?怎么设置?"代空间理解控制新生代大小,影响MinorGC频率和晋升速度
"MetaspaceSize和MaxMetaspaceSize的关系?"元空间机制MetaspaceSize是触发GC阈值,非初始大小
"什么参数最能帮助你排查OOM?"实战配置-XX:+HeapDumpOnOutOfMemoryError + HeapDumpPath
"DisableExplicitGC什么时候用?"NIO理解防止DirectByteBuffer的System.gc()触发Full GC

📚 相关链接

  • ← 返回 **调优索引**
  • **GC调优参数速查** - 更详细的GC参数
  • **垃圾收集器详解(Serial到ZGC)** - 收集器选型
  • **Java堆** - 堆内存结构基础
  • **方法区与元空间** - 元空间详解
  • **直接内存** - 直接内存详解

Knowledge4J — Java 知识库