Размер объекта Java

Как возможно, что минимальный размер объекта Java составляет 8 байт (только заголовок объекта),

Каково потребление памяти объектом в Java?< /а>

если в классе C++, представляющем объект java,

http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/oops/oop.hpp

я вижу, что в классе больше членов

class oopDesc {
  friend class VMStructs;
 private:
  volatile markOop  _mark; // this is the object header
  union _metadata {
    wideKlassOop    _klass;
    narrowOop       _compressed_klass;
  } _metadata; // what about size of this member?

person Krab    schedule 19.03.2015    source источник
comment
Как вы думаете, почему в представлении C++ больше элементов? Их всего два: _mark и _metadata, каждый из них занимает 4 байта на 32-битной архитектуре. _metadata — это объединение, то есть _klass и _compressed_klass занимают одно и то же пространство.   -  person apangin    schedule 19.03.2015
comment
apangin: да, вы правы, моя ошибка, единственный член, который я удалил, был статическим членом, markOop имеет размер 4 байта   -  person Krab    schedule 19.03.2015


Ответы (2)


Это возможно, потому что в 32-битном объекте JVM содержится 4 байта заголовка метки и 4 байта ссылки на класс. Заголовки меток содержат разную информацию в зависимости от типа объекта (размеры в битах):

обычные объекты -> неиспользуемые: 25 хеш: 31 cms_free: 1 возраст: 4biased_lock: 1 блокировка: 2

предвзятые объекты -> JavaThread*:54 эпоха:2 cms_free:1 возраст:4 предвзятая_блокировка:1 блокировка:2

person Jakub Kubrynski    schedule 19.03.2015

Поскольку данные заголовка двоично закодированы. При доступе к этой информации через JVMTI или собственный вызов эти двоичные данные разбиваются на типы данных с более широким диапазоном.

Кроме того, эти размеры являются деталями реализации и варьируются в зависимости от разрядности виртуальной машины и от того факта, что виртуальная машина использует так называемые сжатые упс. Вы можете считать фактический заголовок экземпляра с помощью инструмента JOL, который распространяется в OpenJDK. Кроме того, вы можете найти документация по кодировке заголовка в исходном коде.

person Rafael Winterhalter    schedule 19.03.2015