JVM参数MaxTenuringThreshold的奥秘

当你显式将JVM的-XX:MaxTenuringThreshold参数设置为20的时候,会得到一段Error告警:

java -XX:MaxTenuringThreshold=20 Test 

MaxTenuringThreshold of 20 is invalid; must be between 0 and 15
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit
复制代码

为什么MaxTenuringThreshold参数不能设置为20?为什么必须是0~15之间?以至于甚至都无法启动JVM来运行我们的代码!!!
ps:如果不知道这个参数含义的同学请自行查阅百度。

ObjectHeader32

image.png

ObjectHeader64

image.png

ObjectHeader64Coops
image.png
注:Coops是一种对象指针压缩技术,不在本文讨论范围之内。

其实在上图我们就可以找,不管在32位还是64位的机器中,Mark Word中代表对象年龄的age都只占4bits,所以年龄2进制的最大表示为1111,换算成十进制为15。

看到这里就明白啦!对象年龄最大也就只能设置到15,即默认躲过15次YGC晋升至老年代。

再次执行代码,验证我们的结论:

java -XX:MaxTenuringThreshold=15 Test 

// ---------------output--------------
// hello world
复制代码

OK,成功运行出我们程序员生涯中的第一行代码!!!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享