Что находится в заголовке Java-объекта
Не могли бы вы дать мне некоторую информацию о том, что именно хранится в заголовке объекта? Я знаю, что это, вероятно, зависит от JVM, но, может быть, хотя бы для HotSpot? Я ищу точное описание специально для первого ряда.
Я прочитал несколько информации, которую я не могу проверить положительно с информацией, которую я нахожу. Может быть, у вас есть ссылка на OpenJDK вики, в которой все сказано?
3 ответа
Для HotSpot:
Заголовок объекта состоит из слова-метки и указателя класса.
Слово пометки имеет размер слова (4 byte
на 32-битных архитектурах, 8 byte
на 64-битных архитектурах) и
указатель класса имеет размер слова на 32 bit
архитектуры. На 64 bit
В архитектурах указатель класса имеет размер слова, но также может иметь 4 byte
если адреса кучи могут быть закодированы в этих 4 bytes
,
Эта оптимизация называется "сжатый упс", и вы также можете управлять ей с помощью опции 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 здесь.
Следующая презентация дает вам общее представление о содержании объекта и заголовке объекта: http://www.slideshare.net/cnbailey/memory-efficient-java
Фактический заголовок для любого объекта зависит от поставщика JVM, версии и типа объекта.
Вы можете найти макет объекта из источников HotSpot.
Заголовок состоит из markOop, за которым следует указатель (или сжатый указатель) на instanceKlass.