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
 

注意事项

  1. 参数前缀区分:
    • -:标准参数(如-jar-D);
    • -X:非标准参数(如-Xms-Xmx);
    • -XX:高级参数(如-XX:+UseG1GC),这类参数可能随 JDK 版本变化。
  2. 版本兼容性:部分参数在高版本 JDK 中废弃(如 CMS GC 在 JDK9 后标记为 deprecated,JDK14 移除),需根据实际 JDK 版本调整。
  3. 避免过度配置:优先保证-Xms-Xmx、GC 类型、日志和 OOM 快照参数,其他参数在有明确性能问题时再调优(通过 JProfiler、VisualVM 等工具分析后调整)。

总结

JVM 参数的核心是内存分配和GC 配置,需根据应用类型(Web / 批处理)、服务器资源、性能需求调整。日常开发中,至少要配置堆内存大小、GC 日志、OOM 快照参数,以便问题排查;高并发场景需进一步优化 GC 收集器和停顿时间。
posted @ 2025-10-29 11:31  郭慕荣  阅读(29)  评论(0)    收藏  举报