持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
前一篇学习了谁都知道的堆空间调节,确实能够解决一定的jvm问题。我们也学习了jvm的gc是分代回收的算法,所以它一定可以针对不同的代进行调优,下面我们来一起学习一下。
分代调整
关于分代或者JMM(java内存模型)不熟悉的同学们,请先通过下文了解下:
我们通过Xms,Xmx确定了堆空间的大小之后,就可以针对代空间的大小进行调节了。比如新生代占用堆的多少,老年代又占用多少。年轻代大,相应的老年代就会变小,如何权衡这个比例是我们调优的重点。
调整分代空间大小的标志都是用在年轻代的,而老年代随年轻代大小的变化而变化。有如下常见的标志:
-
-XX:NewRatio:设置年轻代与老年代的比例,默认是 ,也就是年轻代的默认值是堆空间的33%。 -
-XX:NewSize:设置年轻代的默认大小 -
-XX:MaxNewSize:设置年轻代的最大大小
但是通常我们习惯使用-Xmn来将年轻代的最大和最小设置成一样的值。
在不设置MaxNewSize和NewSize的情况下,年轻代的大小是由NewRatio决定的。当设置NewSize后,其优先级将高于NewRatio。
分代大小随着堆空间大小的变化而变化。
比如由于GC频繁,jvm自动增加了堆空间的大小,此时由于NewRatio的比例,年轻代和老年代的大小也随之而变化。想要固定的话,就是将堆空间的初始值和最大值设置为相同,让jvm不再对堆空间进行动态调整。
-Xms256m -Xmx256m