前语


在JVM 篇之 牛刀小试 (一)咱们谈到了关于年青代参数的问题,就是当我没有设置-Xmn的时分,gc时刻竟然比我设置了500m的时分,时刻还短,然后其时我就停止了探究。

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

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

我认为一个好文章,需求引起读者还有咱们的考虑以及火花的磕碰,这才是它的意义地点。

那么下面咱们一起进去探究一下吧~

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

G1 年青代默许巨细

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

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

在一开始接近200m的时分,就进行废物收回,依照默许装备年青代会在40m~614m规模进行调整,咱们看回上一张图的年青代的容量600m,刚好是60%,咱们其时设置堆的巨细是1g,那么这个规模就是40m ~ 614m之间,这就验证了G1会依据gc时刻进行调整年青代的巨细。

坏处:咱们可以看到在机器刚刚启动的时分就进行34次的收回,因为它是在一个比较小的空间4%开始废物收回,然后再渐渐扩大,所以看到它的废物收回次数是比较多的,ygc的时刻其实不长。

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

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

探究年青代gc次数跟时刻平衡

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

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

效果: 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篇之牛刀小试(三)年轻代参数优化探索