Skip to content

常用的 JVM 配置参数有哪些? ​

  • 标签:JVM、Java

🏛 业务架构师 ​

我按用途分组讲高频参数(以 JDK 11+ 为主):

内存边界(容量规划的硬约束)

  • -Xms -Xmx:生产上设成相等——堆动态伸缩的代价是 GC 抖动与内存不确定性;
  • -Xss:线程栈大小(默认 1M)——线程数 × Xss 要计入容器内存预算;
  • -XX:MaxMetaspaceSize:元空间上限——动态类生成业务(CGLIB、脚本引擎)必设,否则被容器 OOMKilled;
  • -XX:MaxDirectMemorySize:堆外内存(Netty 系应用必看)——容器 limit 要 = 堆 + 元空间 + 栈 + 堆外 + 余量,这张预算表是发布规范的一部分。

GC 选择与目标

  • -XX:+UseG1GC(默认)/-XX:MaxGCPauseMillis=200(停顿目标);
  • ZGC:-XX:+UseZGC——超大堆低停顿场景。

排障必备(比调优参数更重要)

  • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=...:OOM 自动留现场——事后分析的唯一依据,没有它重启后现场全失;
  • -Xlog:gc*:file=...:GC 日志(低开销常开);
  • -XX:+PrintNMTStatistics 配 -XX:NativeMemoryTracking:内存去向追踪。

容器感知

  • JDK 10+ 默认感知 cgroup:MaxRAMPercentage(如 75%)按容器 limit 比例给堆——容器时代用比例参数比绝对值更抗规格变更。

我的实践观点:参数标准化 > 个别调优——公司级基础镜像统一一组"安全默认值"(等值堆、dump 必开、GC 日志常开、内存预算齐),业务按需微调。大多数"调参玄学"问题其实是"没有标准"问题。

🏗 系统架构师 ​

按功能分类给常用参数(以 JDK 8/17 为准,生产必备):

内存:

  • -Xms / -Xmx:初始/最大堆,生产设成相等防运行期伸缩抖动;
  • -Xmn:新生代大小(Parallel 调优用,G1 不建议手设);
  • -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m:元空间初始触发 GC 阈值与上限,防动态类膨胀;
  • -Xss:线程栈大小(默认 1MB,海量线程可调小);
  • 容器内:-XX:MaxRAMPercentage=70(比写死 Xmx 更适合弹性环境)。

收集器:

  • -XX:+UseG1GC -XX:MaxGCPauseMillis=200:低延迟服务标配;ZGC:-XX:+UseZGC;
  • -XX:+ParallelRefProcEnabled、G1 Region 大小 -XX:G1HeapRegionSize。

GC 日志与诊断:

  • JDK8:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:...;
  • JDK9+:-Xlog:gc*:file=gc.log:time,uptime:filecount=5,filesize=50m(轮转保留);
  • -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump(OOM 现场必备)。

其他:-XX:+DisableExplicitGC(防业务代码 System.gc(),注意堆外内存依赖时换 ExplicitGCInvokesConcurrent);-Dfile.encoding=UTF-8。

我的实践:参数标准化成基础镜像模板 + 按服务级别(延迟敏感/批处理/大内存)分三档预设;任何参数变更走评审 + 压测回归,JVM 参数是最不该"随口改"的配置。

💻 全栈开发专家 ​

我按"内存、GC、故障诊断、容器"四组给生产模板:

1. 内存与堆:

text
-Xms4g -Xmx4g                        # 相等防抖动
-Xmn / 或 G1 不设新生代交给自动调
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:MaxDirectMemorySize=1g           # NIO/Netty 堆外内存上限
-Xss512k                             # 栈,线程多时控制总内存

2. GC 收集器与日志:

text
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
-Xlog:gc*:file=/var/log/app/gc.log:time,uptime:filecount=5,filesize=50m

3. 故障诊断必备(OOM 三件套,我的军规):

text
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/dump/        # 磁盘要预留空间并定期清理
-XX:+ExitOnOutOfMemoryError         # OOM 快速退出,交给 K8s 拉起,别带病运行

4. 容器环境(K8s 必配):

text
-XX:+UseContainerSupport             # 8u191+ 默认开,感知 cgroup 限制
-XX:MaxRAMPercentage=70.0            # 按容器内存百分比给堆,比写死 -Xmx 更弹性

经验提醒:-Xms=-Xmx 避免运行期扩容抖动;GC 日志一定要开(排查没有日志的全靠猜);OOM 后 ExitOnOutOfMemoryError 让容器重启比"半死不活"更安全;参数变更走配置管理和灰度,别直接改生产启动脚本。