Макет примитивного массива Java в памяти
Вот два примера, на которых я хотел бы основать свой вопрос (при условии, что у вас есть 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
выровнен, так почему нужно добавить больше отступов, чем нужно?
Я знаю о некоторых странных вещах: первая связана с API, который использует JOL, а вторая связана с внутренними данными, которые необходимо скрыть.
Я также знаю об этом, но это кажется не связанным, поскольку это означает внутреннее дополнение.
Может кто-то пролить свет на это?
1 ответ
Instance size: 64 bytes
рассчитывается для текущей конфигурации виртуальной машины, но вы явно указываете другое (несовместимо) Layouter
,
Разница между фактическим размером (рассчитывается с Instrumentation.getObjectSize
) и ожидаемый размер (рассчитанный Layouter) будет рассматриваться как loss due to the next object alignment
,
Смотрите ClassLayout.java