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

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

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

3 ответа

Решение

Для HotSpot:

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

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

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

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

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

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

  1. Один Biased Locking 2, с помощью которого HotSpot может реализовать эффективную блокировку.
  2. Это также используется во время 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 здесь.

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

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

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

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

Другие вопросы по тегам