JVM调优常用参数

§2.1.4 JVM调优常用参数

考察意图:能否根据实际场景选择合适的JVM参数,而非无脑复制粘贴。

回答样板

基础内存参数

参数含义常见设置
-Xms / -Xmx初始/最大堆大小建议设为相同值,避免堆动态扩缩带来的GC抖动。4G服务通常 -Xms4g -Xmx4g
-Xss线程栈大小默认1MB。线程数多且调用栈浅可缩小(512k),递归深可加大
-XX:NewRatio老年代:新生代比例默认2(Old=堆的2/3,Young=1/3)。高并发短命对象可调为1
-XX:SurvivorRatioEden:Survivor比例默认8(Eden:S0:S1=8:1:1)。大多数场景不需改
-XX:MaxTenuringThreshold晋升老年代年龄阈值默认15(CMS默认6)。值小则对象快速晋升但可能过早填满老年代
-XX:MetaspaceSize / -XX:MaxMetaspaceSize元空间初始/最大大小默认无上限(受物理内存限制)。动态生成类多的场景建议设上限防泄漏。典型256m-512m

GC日志参数

1
2
3
4
5
6
7
8
# JDK 8 经典三件套
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
-XX:+PrintHeapAtGC  # GC前后打印堆快照(排查内存泄漏利器)
-XX:+PrintTenuringDistribution  # 打印各年龄段的存活对象分布

# JDK 9+ 统一日志
-Xlog:gc*=info:file=/path/to/gc.log:time,level,tags:filecount=10,filesize=100M
# gc* 表示所有GC相关日志,info级别,滚动10个文件每个100MB

OOM排查必开

参数作用
-XX:+HeapDumpOnOutOfMemoryErrorOOM时自动dump堆快照,生产环境必须开
-XX:HeapDumpPath=/path/to/dumpsdump文件路径,防止撑爆根目录
-XX:OnOutOfMemoryError="kill -9 %p"OOM时执行自定义命令(注意安全隐患)

G1调优参数

参数含义建议
-XX:MaxGCPauseMillis期望最大停顿时间默认200ms,不要设太低(比如10ms)——G1达不到会疯狂GC反而性能下降。服务端通常50-200ms
-XX:G1HeapRegionSizeRegion大小默认堆/2048,取值1/2/4/8/16/32M。大对象多可调大
-XX:ConcGCThreads并发GC线程数默认≈CPU核数的1/4。CPU资源紧张时减半
-XX:InitiatingHeapOccupancyPercent触发并发标记的堆占用阈值默认45%。堆占用达此值触发并发标记周期。值设太低频繁GC浪费CPU,太高预留不够触发Full GC

真实配置示例——安全生产平台(JDK 8, 4核8G)

1
2
3
4
5
6
7
8
9
-Xms4g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=4m
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logs/dumps
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/gc-%t.log
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M

陷阱提示:把线上配置直接复制粘贴但说不清每个参数的业务取舍原因;设 MaxGCPauseMillis=10显得不专业;不知道生产环境必须开HeapDumpOnOutOfMemoryError。

本作品采用 CC BY-NC-SA 4.0 协议进行许可
使用 Hugo 构建
主题 StackJimmy 设计