Что находится в заголовке объекта java

Не могли бы вы дать мне информацию о том, что точно хранится в заголовке объекта? Я знаю, что он, вероятно, зависит от JVM, но, возможно, для HotSpot? Я ищу точное описание для первой строки.

Я прочитал несколько сведений, которые я не могу проверить положительно с информацией, которую я нахожу. Может быть, у вас есть ссылка на wiki OpenJDK, которая говорит все это?

Ответ 1

Для HotSpot:

Заголовок объекта состоит из знака и указателя klass.

Знак имеет размер слова (4 byte на 32-битных архитектурах, 8 byte на 64-битных архитектурах) и

указатель klass имеет размер слова на архитектуре 32 bit. В архитектуре 64 bit указатель klass имеет либо размер слова, но также может иметь 4 byte, если адреса кучи могут быть закодированы в этих 4 bytes.

Эта оптимизация называется "сжатым oops" , и вы также можете управлять ею с помощью опции UseCompressedOops.

Вы также можете найти запись в вики об этом 1.

Значок действительно используется для многих вещей.

  • Один Biased Locking 2, через который HotSpot может реализовать эффективную блокировку.
  • Он также используется во время GC to set forward pointers и to store the age of the objects. Хэш-код идентичности объекта может храниться внутри метки (System.identityHashCode/Object.hashCode).

В исходном коде markOop.hpp есть комментарий, который описывает макет в зависимости от архитектуры:

//  32 bits:
//  --------
//             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
//             size:32 ------------------------------------------>| (CMS free block)
//             PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
//  64 bits:
//  --------
//  unused:25 hash:31 -->| unused:1   age:4    biased_lock:1 lock:2 (normal object)
//  JavaThread*:54 epoch:2 unused:1   age:4    biased_lock:1 lock:2 (biased object)
//  PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
//  size:64 ----------------------------------------------------->| (CMS free block)
//
//  unused:25 hash:31 -->| cms_free:1 age:4    biased_lock:1 lock:2 (COOPs && normal object)
//  JavaThread*:54 epoch:2 cms_free:1 age:4    biased_lock:1 lock:2 (COOPs && biased object)
//  narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
//  unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)

Вы также можете найти заголовочный файл oop здесь.

Ответ 2

В следующей презентации вы получите общее представление о содержимом объекта и заголовке объекта: http://www.slideshare.net/cnbailey/memory-efficient-java

Фактическим заголовком для любого объекта является JVM-поставщик, версия и тип объекта.

Ответ 3

Вы можете найти макет объекта из Источники HotSpot.

Заголовок состоит из markOop, за которым следует указатель (или сжатый указатель) на instanceKlass.