java性能优化--堆空间内的分代空间调整

182 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

前一篇学习了谁都知道的堆空间调节,确实能够解决一定的jvm问题。我们也学习了jvm的gc是分代回收的算法,所以它一定可以针对不同的代进行调优,下面我们来一起学习一下。

分代调整

关于分代或者JMM(java内存模型)不熟悉的同学们,请先通过下文了解下:

# jdk1.8 内存模型

我们通过Xms,Xmx确定了堆空间的大小之后,就可以针对代空间的大小进行调节了。比如新生代占用堆的多少,老年代又占用多少。年轻代大,相应的老年代就会变小,如何权衡这个比例是我们调优的重点。

调整分代空间大小的标志都是用在年轻代的,而老年代随年轻代大小的变化而变化。有如下常见的标志:

  • -XX:NewRatio:设置年轻代与老年代的比例,默认是 年轻代/老年代=1/2年轻代/老年代=1/2,也就是年轻代的默认值是堆空间的33%。

  • -XX:NewSize:设置年轻代的默认大小

  • -XX:MaxNewSize:设置年轻代的最大大小

但是通常我们习惯使用-Xmn来将年轻代的最大和最小设置成一样的值。

在不设置MaxNewSize和NewSize的情况下,年轻代的大小是由NewRatio决定的。当设置NewSize后,其优先级将高于NewRatio。

分代大小随着堆空间大小的变化而变化。

比如由于GC频繁,jvm自动增加了堆空间的大小,此时由于NewRatio的比例,年轻代和老年代的大小也随之而变化。想要固定的话,就是将堆空间的初始值和最大值设置为相同,让jvm不再对堆空间进行动态调整。

-Xms256m -Xmx256m