我正在写一篇 Oracle HotSpot 和 GC 内部结构文章,但我对 OOP(普通对象指针)的含义感到困惑。
Oracle 文档指出 OOP 是指向堆上对象数据结构的 32 或 64 位指针:
“oop”,或者 Java Hotspot 术语中的普通对象指针,是指向对象的托管指针。 oop 通常与本机机器指针大小相同它可以被压缩,但这不是问题。
我想找到有关此数据结构的文章,但随后开始出现混乱。
有些文章说OOP其实是数据结构本身,而不是指针!
其他一些文章在这一点上似乎是矛盾的,例如
infoq.com。首先它声明 OOP 是一个指针:
OOP 是 C / C++ 意义上的真正指针 - 指向 Java 堆内内存位置的机器字。但之后它说:
OOP 由头的两个机器字组成,称为 Mark 和 Klass 字,后面是该实例的成员字段。那么指针由头域和成员域组成?这不可能是真的。
最后尝试查看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;
...
oopsHierarchy.hpp:
typedef class oopDesc* oop;
名称
OOP(普通对象指针)本身就说明了一切:它是对象的指针或引用。 oopDesc
是描述oop指向的对象格式的结构体。它是包含标记字和 Klass 指针的oopDesc。 A
正常(宽)oop 只是堆中对象的普通地址。
压缩(窄)oop是一个编码地址。