常用的 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=50m3. 故障诊断必备(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 让容器重启比"半死不活"更安全;参数变更走配置管理和灰度,别直接改生产启动脚本。