JVM 参数是控制 Java 虚拟机运行行为的核心配置,主要用于内存分配、垃圾回收(GC)调优、日志输出、调试监控等场景。合理配置 JVM 参数能避免 OOM(内存溢出)、优化 GC 性能、提升应用稳定性。以下按功能分类梳理常用参数及配置方式。
JVM 内存模型主要包括堆(Heap)、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器,其中堆和元空间是内存配置的重点(栈内存通常无需频繁调整)。
堆是 JVM 中最大的内存区域,用于存储对象实例,分为新生代(Young Generation) 和老年代(Old Generation),新生代又分为 Eden 区和两个 Survivor 区(S0、S1)。
| 参数 | 作用 | 配置示例 | 说明 |
-Xms
初始堆内存大小
-Xms512m(初始 512MB)
建议与-Xmx保持一致,避免堆动态扩容 / 缩容的性能开销
-Xmx
最大堆内存大小
-Xmx2g(最大 2GB)
根据服务器内存配置(如 8GB 服务器可设为 4-6GB,预留系统和其他进程内存)
-Xmn
新生代内存大小(Eden + S0 + S1)
-Xmn1g(新生代 1GB)
新生代占堆的 1/3~1/2 较合理(太小会导致对象提前进入老年代,太大则老年代变小,频繁 Full GC)
-XX:SurvivorRatio
Eden 区与单个 Survivor 区的比例
-XX:SurvivorRatio=8(默认 8)
表示 Eden:S0:S1 = 8:1:1(总新生代 10 份,Eden 占 8 份,S0 和 S1 各 1 份)
-XX:NewRatio
老年代与新生代的比例(替代-Xmn)
-XX:NewRatio=2(默认 2)
表示老年代:新生代 = 2:1(堆总大小 3 份,老年代 2 份,新生代 1 份)
- JDK 7 及之前:方法区通过 “永久代(PermGen)” 实现,用
-XX:PermSize和-XX:MaxPermSize配置(已废弃)。
- JDK 8 及之后:方法区通过 “元空间(Metaspace)” 实现,元空间默认使用本地内存(不受堆大小限制),需配置以下参数避免元空间溢出(类太多时可能 OOM)。
| 参数 | 作用 | 配置示例 | 说明 |
-XX:MetaspaceSize
元空间初始大小(触发 GC 阈值)
-XX:MetaspaceSize=128m
达到该值时会触发元空间 GC(类卸载),默认约 21MB(太小会频繁触发 GC)
-XX:MaxMetaspaceSize
元空间最大大小
-XX:MaxMetaspaceSize=256m
限制元空间最大占用(如不设置,可能耗尽本地内存导致系统 OOM)
每个线程对应一个虚拟机栈,存储方法调用的栈帧(局部变量、操作数栈等),栈内存过小可能导致StackOverflowError(递归过深)。
| 参数 | 作用 | 配置示例 | 说明 |
-Xss
每个线程的栈内存大小
-Xss1m(1MB)
默认值:JDK 1.8 中 Windows 约 1MB,Linux 约 0.5MB;递归深的应用需调大(如 -Xss2m)
JVM 提供多种垃圾回收器(如 Serial GC、Parallel GC、CMS、G1、ZGC 等),需根据应用类型(吞吐量优先 / 低延迟优先)选择。
| 收集器 | 启用参数 | 适用场景 | 特点 |
Serial GC
-XX:+UseSerialGC
单线程环境、小型应用(如嵌入式设备)
单线程回收,简单高效但停顿时间长(不适合多 CPU 服务器)
Parallel GC
-XX:+UseParallelGC(默认 JDK8)
吞吐量优先的应用(如后台批处理)
多线程回收,注重吞吐量(总 GC 时间 / 总运行时间),停顿时间较长
CMS GC
-XX:+UseConcMarkSweepGC
低延迟优先的应用(如 Web 服务)
并发标记清除,停顿时间短(但 CPU 占用高、内存碎片多,JDK9 后 deprecated)
G1 GC
-XX:+UseG1GC(默认 JDK9+)
中大型堆(4GB 以上)、平衡吞吐量和延迟
区域化分代式,可预测停顿(设置-XX:MaxGCPauseMillis控制目标停顿)
ZGC
-XX:+UseZGC(JDK11+,实验性)
超大堆(16GB 以上)、低延迟(毫秒级停顿)
并发回收,停顿时间极短(<10ms),支持动态堆大小
| 参数 | 作用 | 配置示例 |
-XX:MaxGCPauseMillis
G1 目标最大停顿时间(默认 200ms)
-XX:MaxGCPauseMillis=100(目标停顿 100ms)
-XX:G1HeapRegionSize
G1 区域大小(1MB~32MB,2 的幂次方)
-XX:G1HeapRegionSize=4m(每个区域 4MB)
-XX:InitiatingHeapOccupancyPercent
G1 触发混合回收的老年代占比(默认 45%)
-XX:InitiatingHeapOccupancyPercent=50
GC 日志用于分析 GC 频率、停顿时间、内存变化等,是排查 OOM、GC 频繁等问题的关键依据。
| 参数 | 作用 | 配置示例 |
-XX:+PrintGCDetails
输出详细 GC 日志(包括各区域内存变化)
需配合其他日志参数使用
-XX:+PrintGCDateStamps
日志中添加时间戳(yyyy-MM-dd HH:mm:ss)
便于定位 GC 发生的具体时间
-Xloggc:<file>
将 GC 日志输出到指定文件
-Xloggc:/var/log/myapp/gc.log
-XX:+UseGCLogFileRotation
启用 GC 日志轮转(避免单文件过大)
需配合以下参数
-XX:NumberOfGCLogFiles=<n>
日志文件最大数量
-XX:NumberOfGCLogFiles=5(保留 5 个文件)
-XX:GCLogFileSize=<size>
单个日志文件大小阈值(超过则轮转)
-XX:GCLogFileSize=100m(每个文件 100MB)
用于在应用异常时生成诊断信息(如 OOM 时的堆快照)、启用远程调试等。
| 参数 | 作用 | 配置示例 |
-XX:+HeapDumpOnOutOfMemoryError
OOM 时自动生成堆转储文件(.hprof)
配合 -XX:HeapDumpPath 使用
-XX:HeapDumpPath=<path>
指定堆转储文件路径
-XX:HeapDumpPath=/var/log/myapp/oom.hprof
-XX:+PrintHeapAtGC
GC 前后打印堆内存分布
用于分析 GC 对内存的影响
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
启用远程调试(JDK5+)
允许 IDE 通过 5005 端口远程调试应用
| 参数 | 作用 | 配置示例 |
-XX:+UseCompressedOops
启用对象指针压缩(64 位 JVM 默认开启)
减少指针占用内存(从 8 字节→4 字节)
-XX:MaxDirectMemorySize
直接内存(Direct Memory)最大大小
-XX:MaxDirectMemorySize=512m(默认与堆最大值一致)
-Duser.timezone=GMT+8
设置 JVM 时区(避免时间处理异常)
-Duser.timezone=Asia/Shanghai
JVM 参数通过启动 Java 程序时的命令行参数指定,格式为:
示例:典型 Web 应用配置(8GB 服务器,G1 GC)
-
参数前缀区分:
-:标准参数(如-jar、-D);
-X:非标准参数(如-Xms、-Xmx);
-XX:高级参数(如-XX:+UseG1GC),这类参数可能随 JDK 版本变化。
-
版本兼容性:部分参数在高版本 JDK 中废弃(如 CMS GC 在 JDK9 后标记为 deprecated,JDK14 移除),需根据实际 JDK 版本调整。
-
避免过度配置:优先保证-Xms、-Xmx、GC 类型、日志和 OOM 快照参数,其他参数在有明确性能问题时再调优(通过 JProfiler、VisualVM 等工具分析后调整)。
JVM 参数的核心是内存分配和GC 配置,需根据应用类型(Web / 批处理)、服务器资源、性能需求调整。日常开发中,至少要配置堆内存大小、GC 日志、OOM 快照参数,以便问题排查;高并发场景需进一步优化 GC 收集器和停顿时间。