JVM篇之牛刀小试年轻代参数优化探索

Posted 大鸡腿同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM篇之牛刀小试年轻代参数优化探索相关的知识,希望对你有一定的参考价值。

前言


JVM 篇之 牛刀小试 (一)我们谈到了关于年轻代参数的问题,就是当我没有设置-Xmn的时候,gc时间居然比我设置了500m的时候,时间还短,然后当时我就停止了探索。

后来我在公司飞书文档写了一篇文章分享,然后有位公司leader在我文章评论了,一下子引起了我的好奇心去探索:既然年轻代设置过大的时候,gc时间比较长;过小的时候,gc次数又比较多;那么如何保持他们之间平衡呢?

我认为一个好文章,需要引起读者还有大家的思考以及火花的碰撞,这才是它的意义所在。

那么下面我们一起进去探索一下吧~

G1 年轻代默认大小

经过查阅资料,发现如果不设置大小,年轻代会从堆4%到60%,进行波动,我们在本地进行演示一遍

在一开始接近200m的时候,就进行垃圾回收,按照默认配置年轻代会在40m~614m范围进行调整,我们看回上一张图的年轻代的容量600m,刚好是60%,我们当时设置堆的大小是1g,那么这个范围就是40m ~ 614m之间,这就验证了G1会根据gc时间进行调整年轻代的大小。

弊端:我们可以看到在机器刚刚启动的时候就进行34次的回收,因为它是在一个比较小的空间4%开始垃圾回收,然后再慢慢扩大,所以看到它的垃圾回收次数是比较多的,ygc的时间其实不长。

那么如何保持gc次数跟gc时间相对平衡呢?

探索年轻代gc次数跟时间平衡

经过查阅知乎相关文章,里面提到年轻代跟老年代最好的比例大概是1:2,为了将更多的对象留在老年代,其次减少fullgc的次数。那么我们堆的大小1g,按照这样的算法,年轻代333m,我们扩大一点到350m,给它点扩展的空间~

效果: ygc次数14次,比34次少很多,ygc时间比之前相差0.0几秒,这个是我们能接受的范围。这是机器刚刚启动那会。那么当跑一段时间后,如何来保证gc时间相对比较快呢?

借助 -XX:MaxGCPauseMillis 参数,默认是200ms,它的意义是告诉G1 垃圾回收时间控制在这个时间范围,G1通过gc时间来调整年轻代大小。那么我们可以通过这个参数来控制gc时间(并不是绝对在这个时间范围内),添加参数 -XX:MaxGCPauseMillis=150

总结

最后我们年轻代参数-Xmn350m -XX:MaxGCPauseMillis=150,前一个参数减低ygc的频率,后面的参数告诉G1垃圾回收器,你将gc时间控制在150毫秒进行回收,到此我们基本找到gc次数跟gc时间的一个相对平衡。

以上是关于JVM篇之牛刀小试年轻代参数优化探索的主要内容,如果未能解决你的问题,请参考以下文章

JVM:20 案例:每日上亿请求量的电商系统,年轻代垃圾回收参数如何优化?

案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?

JVM 篇之 牛刀小试 (PS:之前请教我的小伙子校招去了字节~)

JVM 篇之 牛刀小试 (PS:之前请教我的小伙子校招去了字节~)

jvm之年轻代(新生代)老年代永久代以及GC原理详解GC优化

JVM性能优化