参考博客:
面试官:为什么GC分代年龄最大为15
六六答:因为对象头中的Mark Word采用4个bit位来保存年龄,4个bit位能表示的最大数就是15!
评论区:JVM分代年龄之所以设置成15次是因为经过实践证明,对象在经历过15次垃圾回收之后,仍然存活下来的概率非常小,可以被认为是几乎不可能的。因此,将这些存活时间较长的对象放到老年代中,可以更好地利用内存空间,提高垃圾回收的效率和性能。
👇
对象头?????因为GC是将对象进行会回收,来看看对象的结构叭
👇
JAVA对象结构:
我们平时写代码,只是编写对象的实例数据,但其实Java对象除了自身的实例数据外,还包括 对象头 和 对齐字节 ,如下图所示:
对象头包含两类信息:
- 一种是Mark Word :用于存储对象自身的运行时数据,如HashCode,GC的分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等。这部数据的长度在32位和64位的虚拟机中分别为32比特和64比特。(Mark Word的32个比特存储空间中的25个比特用于存储对象的HashCode,4个比特存储对象分代年龄,2个比特存储锁标志位,一个比特固定为0)
- 另一种是Klass Pointer 类型指针,即对象指向它的类型元数据的指针,Java通过这个指针确定该对象是哪个类的实例。但是并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息不一定要经过对象本身。