4C8G的JVM调优

文章讲述了在4核8G的机器环境下,如何设置JVM的堆内存,推荐将其设为4G,并选用G1垃圾收集器以降低STW时间。G1GC被选中是因为其低暂停时间和高吞吐量的特点,同时调整了G1的相关参数如年轻代和老年代的大小比例。此外,还强调了添加必要的日志参数以辅助调优和故障排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、堆内存:

首先是堆内存大小的设置。当我们的机器只有4核8G的时候,堆内存的大小肯定不能太大,一般不建议设置的太大,因为我们需要给机器上的其他应用预留出一部分内容。所以,我们一般建议都是把JVM的堆内存设置成操作系统内存的一半,也就是4G。至于初始内存和最大内存,我们这场景中建议设置成一样的。这样可以避免 JVM 在运行过程中频繁进行内存扩容和收缩操作,提高应用程序的性能和稳定性。

-Xms4G -Xmx4G

 2、垃圾收集器选择

在设置了堆空间的总大小之后,我们需要考虑用那种垃圾收集器。另外,我们前面分析过,这个业务中会频繁在新生代创建并销毁对象,那么,就意味着新生代的GC会比较频繁。所以我们需要选择一种在GC过程中STW时间短的,并且在年轻代的回收中也能发挥效果的。

在新生代的垃圾收集器中,主要以Serial、ParNew、Parallel Scavenge以及支持整堆回收的G1了。

因为新生代采用的都是复制算法,所以不太需要考虑碎片的问题,我们主要考虑吞吐量和STW的时长就行了。

首先排除单线程的Serial,剩下ParNew是一个并发的收集器,Parallel Scavenge更加关注吞吐量,而G1作为JDK 19中默认垃圾收集器,他不仅同时具有低暂停时间和高吞吐量的优点,但是他对内存有要求,最小要4G,

从使用门槛上来说,G1是可以用的,因为一般来说,内存要大于等于4G的话,才适合使用G1进行GC。

所以,我们采用G1作为垃圾收集器:

-XX:+UseG1GC

在使用了G1之后,其实他自己是有一套自动的预测和调优机制的。我们只需要通过参数来设置最大停顿时间就行了。一般建议设置到100-200之间,一般这个时长对用户来说基本无感知:

-XX:MaxGCPauseMillis=200

其次,我们还可以自己调节一些G1的配置,比如设置他的GC线程数,可以先配置4个线程数进行GC,后续根据实际情况再做调整:

-XX:ParallelGCThreads=4 // 设置并行 GC 线程数为 4

-XX:ConcGCThreads=2 // 设置并发 GC 线程数为 2

3、各区大小设置

G1的内存划分是自适应的,它会根据堆的大小和使用情况来动态调整各个区域的大小和比例。但是,我们也可以通过一些JVM参数来手动设置G1的各个分代内存配置。

G1 中的分代和其他垃圾回收器不太一样,它不是严格按照年轻代和老年代划分的,而是通过划分各个区域的存活对象数量来实现垃圾回收的。因此,G1 中不需要像其他垃圾回收器那样设置新生代和老年代的大小比例,而是需要设置一些区域的内存配置。

-XX:G1NewSizePercent和 -XX:G1MaxNewSizePercent分别用于设置年轻代的初始大小和最大大小,它们的默认值分别为 5% 和 60%。针对我们的业务场景,我们其实可以适当的调高一下年轻代的初始大小,5%的比例太小了,我们可以调整到30%。
 

-XX:G1HeapRegionSize=2m:将 G1 的区域大小设置为 2MB,以提高垃圾回收的效率和精度。

-XX:G1NewSizePercent=20:设置年轻代的初始大小为堆的 20%。

-XX:G1MaxNewSizePercent=50:设置年轻代的最大大小为堆的 50%。

-XX:G1OldCSetRegionThresholdPercent=10:设置老年代的大小为堆的 10%。

-XX:G1HeapWastePercent=5:设置垃圾回收后留下的未使用区域的最大比例为 5%。

4、添加必要的日志

因为以上配置都是根据业务大致分析出来的初始配置,所以我们一定是需要不断地调优的,那么必要的日志相关参数就要添加。如:
 

-XX:MaxGCPauseMillis=100:最大 GC 暂停时间为 100 毫秒,可以根据实际情况调整;

-XX:+HeapDumpOnOutOfMemoryError:当出现内存溢出时,自动生成堆内存快照文件;

-XX:HeapDumpPath=/path/to/heap/dump/file.hprof:堆内存快照文件的存储路径;

-XX:+PrintGC:输出 GC 信息;

-XX:+PrintGCDateStamps:输出 GC 发生时间;

-XX:+PrintGCTimeStamps:输出 GC 发生时 JVM 的运行时间;

-XX:+PrintGCDetails:输出 GC 的详细信息;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值