Java 21性能调优

Eave 2026.06.23

堆内存:初始堆和最大堆设置为相同值,避免运行时动态调整带来的性能波动

-Xms4g # 堆内存的最小值
-Xmx4g # 堆内存的最大值

# ZGC的分代是自动管理的,所以ZGC下直接删除所有新生代相关参数
# -Xmn256m # 直接设置新生代大小为 256MB。
# -XX:NewRatio=4 # 设置老年代与新生代的比例为 4:1。对于 4G 的堆,新生代约为 800MB。
# -XX:SurvivorRatio=3 # 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

元空间:必须设置上限防止泄漏

-XX:MaxMetaspaceSize=256m

堆外内存:必须设置上限,特别是使用Netty、gRPC等框架时

-XX:MaxDirectMemorySize=1g

GC:启用Generational ZGC(Java 21新特性),大幅提升GC效率

# ZGC已成为Java 21的默认推荐,追求亚毫秒级暂停
-XX:+UseZGC
# Generational ZGC 已默认开启(无需显式)
-XX:+ZGenerational
# ZGC 并发线程限制(防 CPU 抢占)
-XX:ConcGCThreads=2
# 并行处理引用,提升效率
-XX:+ParallelRefProcEnabled

内存优化

# 压缩对象指针(默认开启,显式声明更安全)
-XX:+UseCompressedOops
# 压缩类指针(默认开启)
-XX:+UseCompressedClassPointers
# 启动时分配所有内存,避免运行时缺页中断
# -XX:+AlwaysPreTouch

容器支持

# 启用容器支持,让JVM感知容器限制(关键!)
-XX:+UseContainerSupport
# 明确指定CPU核心数,与容器分配一致
-XX:ActiveProcessorCount=2

线程:设置线程栈大小,防线程爆炸,默认1M,线程多时浪费严重

-XX:ThreadStackSize=512k

NMT:使用命令jcmd <pid> VM.native_memory summary来查看JVM内部详细的内存分布,精准定位是堆、线程、类(元空间)还是堆外内存(Internal)占用了过多空间

-XX:NativeMemoryTracking=summary

OOM诊断:发生OOM时自动生成堆转储

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/{{appname}}/heap-dump.hprof
-XX:+ExitOnOutOfMemoryError    # 防止OOM后进程假死
-XX:ErrorFile=/var/log/{{appname}}/oom.log

GC日志

# 异步日志记录,减少对应用性能的影响
-Xlog:gc*,gc+heap=debug,gc+ergo=debug:file=/var/log/{{appname}}/gc-%t.log:time,level,tags:filecount=5,filesize=100M
-Xlog:async

JVM运行时优化

# 保留频繁异常的堆栈信息
-XX:-OmitStackTraceInFastThrow
# 禁用perf数据共享内存,避免tmp目录问题
-XX:+PerfDisableSharedMem