我正在撰写Oracle HotSpot和GC internals文章,但我对OOP(普通对象指针)的含义感到困惑。
Oracle documentation表明OOP是指向堆上对象数据结构的32位或64位指针:
Java Hotspot用语中的" oop"或普通对象指针是指向对象的托管指针。 oop通常与本机指针的大小相同
它可以被压缩,但这就是问题。
我想找到关于这个数据结构的文章,但随后开始出现混乱。
有些文章说OOP实际上是数据结构本身,而不是指针!
其他一些文章在这一点上似乎是矛盾的,例如on infoq.com。首先,它声明OOP是一个指针:
OOP是C / C ++意义上的真正指针 - 一个指向Java堆内部位置的机器字。
但在那之后它说:
OOP由两个标题的机器字组成,称为Mark和Klass字,后跟此实例的成员字段。
那么指针由标题和成员字段组成?这不可能是真的。
最后,我尝试查看Oracle JDK和OpenJDK HotSpot源代码的源代码(因为Oracle HotSpot不是开源代码)。但基于此,似乎OOP确实是对象数据结构。但在这种情况下指针是什么?
所以问题是: HotSpot JVM中的OOP是什么?
答案 0 :(得分:3)
class oopDesc {
friend class VMStructs;
private:
volatile markOop _mark;
union _metadata {
Klass* _klass;
narrowKlass _compressed_klass;
} _metadata;
...
typedef class oopDesc* oop;
名称 OOP (普通对象指针)不言而喻:它是指针或引用一个东西。 oopDesc
是描述 oop 指向的对象格式的结构。 oopDesc 包含标记字和Klass指针。
普通(宽)oop 只是堆中对象的普通地址。
压缩(窄)oop 是编码地址。
还有oop handle的概念 - 对GC期间遍历和更新的oop的管理引用。它基本上是一个间接层次。