Java21参数优化

Eave 2025.11.11

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

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

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

-XX:MaxMetaspaceSize=256m
# 堆外内存:必须设置上限,特别是使用Netty、gRPC等框架时
-XX:MaxDirectMemorySize=512m

垃圾回收器:ZGC已成为Java 21的默认推荐,追求亚毫秒级暂停

-XX:+UseZGC
# 启用Generational ZGC(Java 21新特性),大幅提升GC效率
-XX:+ZGenerational
# 并行处理引用,提升效率
-XX:+ParallelRefProcEnabled

内存管理优化

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

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

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/logs/heap-dump.hprof

现代GC日志记录(JVM Unified Logging Framework)

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

JVM运行时优化

-XX:-OmitStackTraceInFastThrow     # 保留频繁异常的堆栈信息
-XX:+PerfDisableSharedMem          # 禁用perf数据共享内存,避免tmp目录问题
-XX:+UseContainerSupport           # 启用容器支持,让JVM感知容器限制(关键!)
-XX:ActiveProcessorCount=2         # 明确指定CPU核心数,与容器分配一致

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

# jstat -gc pid:查看堆和元空间的内存使用详情和 GC 情况。
-XX:NativeMemoryTracking=summary