直接进老年代的大对象指的是shallow还是retained
在JVM(尤其是HotSpot VM)的“大对象直接进入老年代”策略中,“大对象”指的是对象的 shallowsize(浅堆大小),而不是 retained size。
-
大对象阈值判断依据:JVM参数
-XX:PretenureSizeThreshold设置的就是对象的浅堆大小阈值(在G1、ZGC等现代垃圾收集器中,PretenureSizeThreshold(大对象阈值)通常不起完全相同的作用)。当对象在Eden区分配时,如果它的浅堆大小大于这个阈值,就直接在老年代分配。 -
原因:判断是否“大”的依据是对象本身占用的连续内存空间大小。这个大小就是浅堆大小——即对象头(mark word、klass pointer)加实例数据(instance data)占用的字节数。
为什么不看 Retained Size?
-
Retained size 是指对象被GC回收时,能一起被释放的整个对象图的堆内存总量(包括它引用的其他对象)。这个大小在分配时通常无法事先准确计算,可能导致循环引用、共享子对象等复杂情况。
-
JVM分配对象是线性快速过程,只能基于当前对象自身大小(浅堆大小)决定放入哪个区域,不可能去做可达性分析或图遍历来计算保留集。
-
阈值判断的简洁性与确定性:浅堆大小是对象头部就能确定的信息(类元数据、数组长度等),计算成本极低。
