性能问答>为什么并发GC的年龄阈值默认为6>
3回复
9月前

为什么并发GC的年龄阈值默认为6



为什么当垃圾收集器使用CMS+ParNew组合时,-XX:MaxTenuringThreshold的默认值为6,为什么是会6?而不是和Parallel及G1一样默认为15呢?
image.png

1016 阅读
请先登录,再评论

简单来说是因为CMS对内存碎片尤其敏感,且会导致单线程Serial Full GC这个尤其严重的结果,而从结果上说,越大的MaxTenuringThreshold会更快的导致heap的碎片化(不光是old区,首先要明白对于内存的分配并不是真的一个对象一个对象紧密排列的),所以历代CMS默认这个值都会比较小(jdk8以前是4,jdk调整为6);至于为何较大的MaxTenuringThreshold会更快的导致内存碎片,这个需要开一堂数学建模课来解释😓,简单而言可以理解成这个是大部分通常性案例的结果,但是这个东西其实还是跟应用程序本身的特性有关的,比如我完全没有老年代对象,全是保证再15代内能回收的对象,那我把这个调到15就根本没问题(当然我能保证这个的话我也就根本不需要用cms了😇)

39月前
回复 ferdi:

谢谢大佬,醍醐灌顶

9月前回复

jvm内部用四个字节去存,你同样可以设置为小于等于15的数值,至于为什么默认值设为6,我也想知道😝

9月前