【优化】JVM调优

使用ZGC

配置和调优

可用选项概览

ZGC 可以使用的 JVM 选项 :

通用 GC 选项

ZGC 选项

ZGC 诊断选项 (-XX:+UnlockDiagnosticVMOptions)

-XX:MinHeapSize, -Xms -XX:InitialHeapSize, -Xms -XX:MaxHeapSize, -Xmx -XX:SoftMaxHeapSize -XX:ConcGCThreads -XX:ParallelGCThreads -XX:UseDynamicNumberOfGCThreads -XX:UseLargePages -XX:UseTransparentHugePages -XX:UseNUMA -XX:SoftRefLRUPolicyMSPerMB -XX:AllocateHeapAt

-XX:ZAllocationSpikeTolerance -XX:ZCollectionInterval -XX:ZFragmentationLimit -XX:ZMarkStackSpaceLimit -XX:ZProactive -XX:ZUncommit -XX:ZUncommitDelay

-XX:ZStatisticsInterval -XX:ZVerifyForwarding -XX:ZVerifyMarking -XX:ZVerifyObjects -XX:ZVerifyRoots -XX:ZVerifyViews

启用 ZGC

使用 -XX:+UseZGC 选项启用 ZGC.

设置堆空间大小

最大堆内存 (-Xmx<size>),对ZGC来说是最重要的调优选项。设置合理的堆内存大小, 保证有足够的空间存放存活的对象(live-set)以及 GC运行时还有足够的空间拿分配。堆空间分配多大, 取决于应用的内存分配频率和存活对象大小。通常来说,给ZGC的内存越大越好,但是浪费内存也不太好。所以最好根据内存使用情况和GC频率来调整。

设置GC并发线程数

第二个值得关注的选项是GC并发线程数( -XX:ConcGCThreads=<number>)。ZGC会启发式的自动选择线程数,多数情况下自动选择线程数就可以了, 但是有时候根据应用的特点, 可能需要调整。 这个选项,本质上是指定了GC占用的CPU时间, 设置过大就会占用应用的CPU时间;如果太小,应用产生垃圾对象的速度又会超过GC速度。

注意! 如果系统对响应时间要求高, 那最好不要过度压榨机器, cpu使用率最好不要超过70%。

返还未使用内存给操作系统

默认情况下,ZGC 会返还未使用的内存给操作系统。 这个特性对于那些关注内存占用大小的应用和环境比较有用。通过-XX:-ZUncommit 可禁用些特性。当然,返还操作不会让堆内存小于设置的最小堆大小(-Xms)。 所以如果-Xms-Xmx 一样的话, 这个特性也就不起作用了。

返还延迟使用-XX:ZUncommitDelay=<seconds> 设置, 默认是300秒。此选项指定内存多久未被使用后, 会返还给操作系统。

nohup /usr/java/jdk-17.0.8/bin/java -XX:+UseZGC --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED  --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED -Dloader.path=/opt/jar/lib/* -Xms256m -Xmx1400m -jar manage-service-3.0.jar &

参考

java ZGC 使用与调优 | Kindrage's blog (win11.ren)