2016-12-30 2 views
1

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

Oracle documentation утверждает, что ООП является 32 или 64 битный указатель на объект структура данных в куче:

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

Он может быть сжат, но это, к тому же, проблема.

Я хотел найти статьи об этой структуре данных, но затем началось замешательство.

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

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

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

, но после того, что он говорит:

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

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

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

Вопрос в таком виде: Что такое ООП в JVM HotSpot?

ответ

0

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; 

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

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

Существует также понятие oop handle - управляемая ссылка на oop, пройденная и обновленная во время GC. Это в основном еще один уровень косвенности.

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