【发布时间】:2018-05-24 12:12:05
【问题描述】:
这是我想提出问题的两个示例(假设您在这里有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,但它似乎无关,因为它意味着内部填充。
有人可以解释一下吗?
【问题讨论】:
-
Aren't alignments always a power of 2? 在这两种情况下,大小都大于 32 个字节,因此您需要最多填充 64 个字节。但不确定这是否适用于此...
-
FWIW,我得到了 56 字节的实例大小,由于 32 位中的下一个对象对齐而丢失了 4 个,在 64 位中丢失了 0 个。
-
@Michael 指出它确实不是必须是二的幂,对吧?我正在研究一个例子来向 JornVernee 证明这一点
-
如果你在对象头的某处看不到数组长度,你就知道有问题了……
-
@Holger :) 哦,天哪!甚至没有注意到,真是个白痴……谢谢!
标签: java arrays jvm jvm-hotspot jol