Является ли Ordinary Object Pointer указателем или структурой объекта в HotSpot?

Я работаю над статьей о внутренних компонентах Oracle HotSpot и GC, но меня смущает значение ООП (обычный указатель объекта).

В документации Oracle указано, что OOP — это 32- или 64-битный указатель на структуру данных объекта в куче:

«oop», или обычный указатель объекта на языке Java Hotspot, является управляемым указателем на объект. oop обычно имеет тот же размер, что и машинный указатель.

Его можно сжать, но это не проблема.

Я хотел найти статьи об этой структуре данных, но тут началась путаница.

В некоторых статьях говорится, что ООП на самом деле является самой структурой данных, а не указателем!

Некоторые другие статьи кажутся противоречивыми по этому поводу, например на infoq.com. Сначала он утверждает, что ООП является указателем:

ООП — это настоящий указатель в смысле C/C++ — машинное слово, указывающее на ячейку памяти внутри кучи Java.

но после этого пишет:

OOP состоит из двух машинных слов заголовка, которые называются словами Mark и Klass, за которыми следуют поля-члены этого экземпляра.

Значит, указатель состоит из полей заголовка и поля-члена? Это не может быть правдой.

Наконец, я попытался посмотреть исходный код Oracle JDK и исходный код OpenJDK HotSpot (потому что Oracle HotSpot не является открытым исходным кодом). Но исходя из этого казалось, что ООП действительно является структурой данных объекта. Но в этом случае что такое указатель?

Итак, вопрос: что такое ООП в HotSpot JVM?


person Robert    schedule 30.12.2016    source источник


Ответы (1)


oop.hpp из исходного кода HotSpot:

class oopDesc {
  friend class VMStructs;
 private:
  volatile markOop  _mark;
  union _metadata {
    Klass*      _klass;
    narrowKlass _compressed_klass;
  } _metadata;

...

oopsHierarchy.hpp :

typedef class oopDesc*    oop;

Название ООП (обычный указатель объекта) говорит само за себя: это указатель или ссылка на объект. oopDesc — это структура, описывающая формат объекта, на который указывает oop. Это oopDesc, который содержит слово метки и указатель класса.

Обычный (широкий) oop — это просто адрес объекта в куче.
сжатый (узкий) oop — это закодированный адрес.

Существует также понятие дескриптор цикла – управляемая ссылка на объект цикла, пройденный и обновленный во время сборки мусора. По сути, это еще один уровень косвенности.

person apangin    schedule 30.12.2016