Java примитивный макет массива в памяти - PullRequest
0 голосов
/ 24 мая 2018

Вот два примера, на которых я хотел бы основать свой вопрос (при условии, что у вас есть 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 Ответ

0 голосов
/ 24 мая 2018

Instance size: 64 bytes рассчитывается для текущей конфигурации виртуальной машины, но вы явно указываете другое (несовместимое) Layouter.

Разница между фактическим размером (рассчитывается с помощью Instrumentation.getObjectSize)и ожидаемый размер (рассчитанный Layouter) будет рассматриваться как loss due to the next object alignment.

См. ClassLayout.java

...