以下是我想根据问题提出的两个示例(假设您在此处JOL
):
Layouter layout32Bits = new HotSpotLayouter(new X86_32_DataModel());
Layouter layout64BitsComp = new HotSpotLayouter(new X86_64_COOPS_DataModel());
使用此示例:
int [] ints = new int[10];
System.out.println(ClassLayout.parseInstance(ints, layout32Bits).toPrintable());
System.out.println(ClassLayout.parseInstance(ints, layout64BitsComp).toPrintable());
这是两个输出:
[I object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 09 00 00 00 (00001001 00000000 00000000 00000000) (9)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 10 1b 0c 1a (00010000 00011011 00001100 00011010) (437000976)
12 40 int [I.<elements> N/A
52 12 (loss due to the next object alignment)
Instance size: 64 bytes
Space losses: 0 bytes internal + 12 bytes external = 12 bytes total
[I object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 09 00 00 00 (00001001 00000000 00000000 00000000) (9)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
8 4 (object header) 10 1b 0c 1a (00010000 00011011 00001100 00011010) (437000976)
12 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
16 40 int [I.<elements> N/A
56 8 (loss due to the next object alignment)
Instance size: 64 bytes
Space losses: 0 bytes internal + 8 bytes external = 8 bytes total
我主要理解输出,我不知道这些是什么:
12 bytes external and 8 bytes external
一般情况下,对象8 bytes
已对齐,为什么需要添加更多填充?为什么需要?
我知道一些奇怪的事情,the first one has to do with the API that JOL is using和第二个has to do with internal data, that needs to be hidden。
我也知道this,但它似乎没有关系,因为它意味着内部填充。
有人可以对此有所了解吗?
答案 0 :(得分:4)
Instance size: 64 bytes
是针对当前VM配置计算的,但您明确指定了不同的(不兼容的)Layouter
。
实际尺寸(使用Instrumentation.getObjectSize
计算)与预期尺寸(由Layouter计算)之间的差异将被视为loss due to the next object alignment
。