HotSpot中Ordinary Object Pointer是指针还是对象结构?
Is Ordinary Object Pointer a pointer or an object structure in HotSpot?
我正在撰写 Oracle HotSpot 和 GC 内部的文章,但我对 OOP(普通对象指针)的含义感到困惑。
Oracle documentation 指出 OOP 是指向堆上对象数据结构的 32 位或 64 位指针:
An "oop", or ordinary object pointer in Java Hotspot parlance, is a managed pointer to an object. An oop is normally the same size as a native machine pointer
它可以被压缩,但这不是问题。
我想找到有关此数据结构的文章,但随后开始感到困惑。
有些文章说OOP其实是数据结构本身,而不是指针!
其他一些文章在这一点上似乎自相矛盾,例如on infoq.com。起初它声明 OOP 是一个指针:
An OOP is a genuine pointer in the C / C++ sense - a machine word which points to a memory location inside the Java heap.
但在那之后它说:
An OOP consists of two machine words of header, which are called the Mark and the Klass words followed by the member fields of this instance.
所以指针由头域和成员域组成?这不可能是真的。
最后我尝试查看了Oracle JDK 和OpenJDK HotSpot 源码的源代码(因为Oracle HotSpot 不开源)。但基于此,OOP 似乎确实是对象数据结构。但是在这种情况下,指针是什么?
所以问题是:HotSpot JVM 中的 OOP 是什么?
oop.hpp 来自 HotSpot 源代码:
class oopDesc {
friend class VMStructs;
private:
volatile markOop _mark;
union _metadata {
Klass* _klass;
narrowKlass _compressed_klass;
} _metadata;
...
typedef class oopDesc* oop;
名称OOP(普通对象指针)不言而喻:它是指针 或 reference 对象。 oopDesc
是描述oop指向的对象格式的结构。 oopDesc包含了mark word和Klass指针
A 普通(宽)oop 只是堆中对象的普通地址。
压缩(窄)oop 是编码地址。
还有一个概念 oop handle - 对在 GC 期间遍历和更新的 oop 的托管引用。基本上就是多了一层间接。
我正在撰写 Oracle HotSpot 和 GC 内部的文章,但我对 OOP(普通对象指针)的含义感到困惑。
Oracle documentation 指出 OOP 是指向堆上对象数据结构的 32 位或 64 位指针:
An "oop", or ordinary object pointer in Java Hotspot parlance, is a managed pointer to an object. An oop is normally the same size as a native machine pointer
它可以被压缩,但这不是问题。
我想找到有关此数据结构的文章,但随后开始感到困惑。
有些文章说OOP其实是数据结构本身,而不是指针!
其他一些文章在这一点上似乎自相矛盾,例如on infoq.com。起初它声明 OOP 是一个指针:
An OOP is a genuine pointer in the C / C++ sense - a machine word which points to a memory location inside the Java heap.
但在那之后它说:
An OOP consists of two machine words of header, which are called the Mark and the Klass words followed by the member fields of this instance.
所以指针由头域和成员域组成?这不可能是真的。
最后我尝试查看了Oracle JDK 和OpenJDK HotSpot 源码的源代码(因为Oracle HotSpot 不开源)。但基于此,OOP 似乎确实是对象数据结构。但是在这种情况下,指针是什么?
所以问题是:HotSpot JVM 中的 OOP 是什么?
oop.hpp 来自 HotSpot 源代码:
class oopDesc {
friend class VMStructs;
private:
volatile markOop _mark;
union _metadata {
Klass* _klass;
narrowKlass _compressed_klass;
} _metadata;
...
typedef class oopDesc* oop;
名称OOP(普通对象指针)不言而喻:它是指针 或 reference 对象。 oopDesc
是描述oop指向的对象格式的结构。 oopDesc包含了mark word和Klass指针
A 普通(宽)oop 只是堆中对象的普通地址。
压缩(窄)oop 是编码地址。
还有一个概念 oop handle - 对在 GC 期间遍历和更新的 oop 的托管引用。基本上就是多了一层间接。