2014-10-14 19 views
27

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

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

ответ

31

Для HotSpot:

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

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

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

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

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

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

  1. Первый: Biased Locking2, через который HotSpot может реализовать эффективную блокировку.
  2. Он также используется во время GC to set forward pointers и to store the age of the objects. Идентификационный код хэша объекта может быть сохранен внутри метки (/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) 

Вы также можете найти файл заголовка here уп.

+3

"OOP" означает * указатель обычный объект * – user2418306

3

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

Реальный заголовок для любого объекта является JVM поставщик, версия и типа объекта специфична.

Смежные вопросы