06.1 - JVM参数分类速查
定位: JVM有1000+参数,这是按功能分类的生产可用参数速查表,不是按字母排序的废话手册 面试高频度: ⭐⭐⭐⭐
一、为什么需要这个页面?
JVM有超过1000个-XX参数,但生产环境中90%的问题只用得到其中约30个。按字母排序的完整参数列表没有意义——你需要的是按场景分类的速查表:
- 遇到OOM → 看内存参数 + dump参数
- 需要选GC → 看GC参数
- 排查性能 → 看诊断参数
- JIT问题 → 看编译参数
二、核心参数分类
2.1 堆内存参数
| 参数 | 默认值 | 含义 | 使用场景 | 面试频率 |
|---|---|---|---|---|
-Xms | 1/64物理内存 | 初始堆大小 | 设为与-Xmx相同,避免扩容开销 | ⭐⭐⭐⭐⭐ |
-Xmx | 1/4物理内存 | 最大堆大小 | 生产建议: 不超过物理内存的70% | ⭐⭐⭐⭐⭐ |
-Xmn | 1/3堆 | 新生代大小 | 调优重点: GC频率和时间的主要关联参数 | ⭐⭐⭐⭐⭐ |
-XX:NewRatio | 2 (Old:Young=2:1) | 老年代:新生代比例 | 控制代空间比例 | ⭐⭐⭐ |
-XX:SurvivorRatio | 8 (Eden:Survivor=8:1) | Eden:Survivor比例 | 默认8:1:1,增大可减少晋升 | ⭐⭐⭐⭐ |
-XX:MaxTenuringThreshold | 6/15 (G1:15,CMS:6) | 最大晋升阈值 | 增大可减少过早晋升 | ⭐⭐⭐⭐ |
-XX:+UseAdaptiveSizePolicy | true | 自适应大小调整 | Parallel GC默认开启 | ⭐⭐⭐ |
🔑 关键原则: -Xms和-Xmx设为相同值,避免运行时动态扩缩带来的性能损失。-Xmn的设置直接影响Minor GC频率和晋升速度——新生代越大,Minor GC越少,但老年代空间越小。
2.2 元空间参数
| 参数 | 默认值 | 含义 | 使用场景 | 面试频率 |
|---|---|---|---|---|
-XX:MetaspaceSize | 约21MB | 元空间初始大小(触发Full GC的阈值) | 设为较大的值,减少元空间扩容触发的GC | ⭐⭐⭐⭐ |
-XX:MaxMetaspaceSize | 无限制 | 最大元空间大小 | 必须设置!防止类加载泄漏耗尽内存 | ⭐⭐⭐⭐ |
-XX:MinMetaspaceFreeRatio | 40 | GC后元空间最小空闲比例 | 扩容灵敏度控制 | ⭐⭐ |
🔑 关键原则: MetaspaceSize不是初始分配大小,而是触发元空间GC的阈值。设得太小(默认21MB)会导致频繁元空间GC。生产建议设为256MB+。
2.3 直接内存参数
| 参数 | 默认值 | 含义 | 使用场景 | 面试频率 |
|---|---|---|---|---|
-XX:MaxDirectMemorySize | 等于-Xmx | 最大直接内存 | NIO/Netty应用必须设置 | ⭐⭐⭐ |
-XX:+DisableExplicitGC | false | 禁用System.gc() | 防止DirectByteBuffer被GC误触发 | ⭐⭐⭐ |
🔑 关键原则: DirectByteBuffer的回收依赖System.gc()触发的Reference Handler,所以-XX:+DisableExplicitGC后,DirectByteBuffer只能等堆外内存耗尽后抛出OOM。需要使用-XX:MaxDirectMemorySize明确限制。
2.4 GC参数
GC选择
| 参数 | 含义 | 适用场景 | 面试频率 |
|---|---|---|---|
-XX:+UseSerialGC | Serial + Serial Old | 单核/小堆/客户端 | ⭐⭐ |
-XX:+UseParallelGC | Parallel Scavenge + Parallel Old | 吞吐量优先(批处理/数仓) | ⭐⭐⭐⭐ |
-XX:+UseConcMarkSweepGC | ParNew + CMS | 低延迟优先(已废弃) | ⭐⭐⭐⭐⭐ |
-XX:+UseG1GC | G1 | 默认GC,兼顾吞吐量和延迟(JDK9+) | ⭐⭐⭐⭐⭐ |
-XX:+UseZGC | ZGC | 亚毫秒暂停(JDK15+) | ⭐⭐⭐ |
-XX:+UseShenandoahGC | Shenandoah | 低暂停(JDK12+) | ⭐⭐ |
GC调优
| 参数 | 默认值 | 含义 | 使用场景 |
|---|---|---|---|
-XX:ParallelGCThreads | CPU核数 | 并行GC线程数 | 多核系统适量减少 |
-XX:ConcGCThreads | ParallelGCThreads * 2/3 (G1: 1/4) | 并发GC线程数 | 控制并发标记开销 |
-XX:G1HeapRegionSize | 1-32MB (自动) | G1 Region大小 | 控制Region数(建议2048左右) |
-XX:MaxGCPauseMillis | 200ms | 目标最大GC暂停 | G1/CMS的暂停目标 |
-XX:GCTimeRatio | 99 | GC时间占总时间目标(1/(1+99)=1%) | 吞吐量目标 |
-XX:+UseAdaptiveSizePolicy | true | 自适应代大小调整 | Parallel GC专用 |
-XX:InitiatingHeapOccupancyPercent | 45 (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:+PrintHeapAtGC | GC前后堆信息 | 详细分析 |
-XX:+PrintTenuringDistribution | 晋升年龄分布 | 调优Survivor |
-XX:+PrintReferenceGC | 引用处理耗时 | 分析Reference处理瓶颈 |
-XX:+PrintAdaptiveSizePolicy | 自适应调整决策 | 了解GC的策略变化 |
JDK 9+ 统一方式:
-Xlog:gc*:file=gc.log:time,level,tagsJDK 9+统一使用-Xlog语法。GC日志参数变了,排查思维不变。
2.6 OOM诊断参数
| 参数 | 含义 | 必配指数 |
|---|---|---|
-XX:+HeapDumpOnOutOfMemoryError | OOM时自动dump堆 | ⭐⭐⭐⭐⭐ 每个Java应用必配 |
-XX:HeapDumpPath=<path> | dump文件路径 | ⭐⭐⭐⭐⭐ |
-XX:+PrintClassHistogramAfterFullGC | Full GC后打印类直方图 | ⭐⭐⭐ |
-XX:OnOutOfMemoryError=<cmd> | OOM时执行命令 | ⭐⭐⭐ |
-XX:+ExitOnOutOfMemoryError | OOM时退出JVM | ⭐⭐⭐ |
-XX:+CrashOnOutOfMemoryError | OOM时生成crash文件 | ⭐⭐ |
2.7 编译参数
| 参数 | 默认值 | 含义 | 使用场景 |
|---|---|---|---|
-XX:TieredStopAtLevel | 4 (开启C2) | 分层编译最高层级 | 关闭C2: -XX:TieredStopAtLevel=1 |
-XX:+PrintCompilation | false | 打印方法编译日志 | 排查JIT问题 |
-XX:ReservedCodeCacheSize | 240MB | Code Cache最大大小 | 代码量大时增大 |
-XX:InitialCodeCacheSize | 约160KB | Code Cache初始大小 | 一般不动 |
-XX:+PrintCodeCache | false | 打印Code Cache使用率 | Code Cache满则JIT不再生效 |
-XX:+UseCounterDecay | true | JIT计数器衰减 | 避免不常用方法编译 |
-XX:-BackgroundCompilation | true | 后台编译(不会阻塞) | 关闭后编译线程阻塞执行 |
2.8 线程参数
| 参数 | 默认值 | 含义 | 使用场景 |
|---|---|---|---|
-Xss | 1MB (Linux x64) | 线程栈大小 | 减少可增线程数,过大消耗内存 |
-XX:ThreadStackSize | 同上 | 同上(单位KB) | -Xss的等效参数 |
-XX:ActiveProcessorCount | CPU数 | JVM看到的CPU数 | 容器环境覆盖OS检测 |
2.9 其他重要参数
| 参数 | 默认值 | 含义 | 使用场景 |
|---|---|---|---|
-XX:+DisableExplicitGC | false | 禁用System.gc() | 防止NIO框架显式GC |
-XX:+UseCompressedOops | true | 压缩对象指针(32位) | 堆<32GB时开启,减少内存浪费 |
-XX:+UseCompressedClassPointers | true | 压缩类指针 | 依赖于UseCompressedOops |
-XX:+AlwaysPreTouch | false | 启动时预分配物理内存 | 减少运行时缺页中断 |
-XX:LargePageSizeInBytes | 0(自动) | 大页大小 | 启用大页提升TLB命中率 |
-XX:+UseLargePages | false | 使用大页 | 需要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:+UseCompressedOops8C16G 在线服务
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:+UseCompressedOops16C32G 批处理(吞吐量优先)
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堆** - 堆内存结构基础
- **方法区与元空间** - 元空间详解
- **直接内存** - 直接内存详解