jvm常用的参数有哪些? 怎么配置?
JVM 参数是控制 Java 虚拟机运行行为的核心配置,主要用于内存分配、垃圾回收(GC)调优、日志输出、调试监控等场景。合理配置 JVM 参数能避免 OOM(内存溢出)、优化 GC 性能、提升应用稳定性。以下按功能分类梳理常用参数及配置方式。
一、内存配置参数(最核心,必配)
JVM 内存模型主要包括堆(Heap)、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器,其中堆和元空间是内存配置的重点(栈内存通常无需频繁调整)。
1. 堆内存配置(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 份) |
2. 方法区 / 元空间配置(Metaspace)
- 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) |
3. 栈内存配置(虚拟机栈)
每个线程对应一个虚拟机栈,存储方法调用的栈帧(局部变量、操作数栈等),栈内存过小可能导致
StackOverflowError(递归过深)。| 参数 | 作用 | 配置示例 | 说明 |
|---|---|---|---|
-Xss |
每个线程的栈内存大小 | -Xss1m(1MB) |
默认值:JDK 1.8 中 Windows 约 1MB,Linux 约 0.5MB;递归深的应用需调大(如 -Xss2m) |
二、垃圾回收器(GC)配置参数
JVM 提供多种垃圾回收器(如 Serial GC、Parallel GC、CMS、G1、ZGC 等),需根据应用类型(吞吐量优先 / 低延迟优先)选择。
1. 选择 GC 收集器
| 收集器 | 启用参数 | 适用场景 | 特点 |
|---|---|---|---|
| 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),支持动态堆大小 |
2. GC 调优核心参数(以 G1 为例)
| 参数 | 作用 | 配置示例 |
|---|---|---|
-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 日志用于分析 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 程序时的命令行参数指定,格式为:
java [JVM参数] -jar 应用.jar
示例:典型 Web 应用配置(8GB 服务器,G1 GC)
java \
-Xms4g -Xmx4g \ # 堆初始和最大4GB
-Xmn2g \ # 新生代2GB(占堆的1/2)
-XX:SurvivorRatio=8 \ # Eden:S0:S1=8:1:1
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m \ # 元空间
-XX:+UseG1GC -XX:MaxGCPauseMillis=100 \ # G1 GC,目标停顿100ms
-Xloggc:/var/log/app/gc.log \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100m \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/oom.hprof \
-jar app.jar
注意事项
-
参数前缀区分:
-:标准参数(如-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 收集器和停顿时间。
郭慕荣博客园

浙公网安备 33010602011771号