我正在撰写一篇 Oracle HotSpot 和 GC 内部文章,但我对 OOP(普通对象指针)的含义感到困惑。
Oracle 文档指出 OOP 是指向堆上对象数据结构的 32 位或 64 位指针:
“oop”或 Java Hotspot 用语中的普通对象指针是指向对象的托管指针。oop 通常与本机机器指针大小相同
它可以被压缩,但这不是问题。
我想查找有关此数据结构的文章,但随后开始出现混乱。
有些文章说 OOP 实际上是数据结构本身,而不是指针!
其他一些文章在这一点上似乎是矛盾的,比如infoq.com。起初它声明 OOP 是一个指针:
OOP 是 C / C++ 意义上的真正指针 - 指向 Java 堆内的内存位置的机器字。
但在那之后它说:
一个 OOP 由 header 的两个机器字组成,分别称为 Mark 和 Klass 字,后跟该实例的成员字段。
那么指针是由头域和成员域组成的吗?那不可能是真的。
最后我试着看了一下Oracle JDK和OpenJDK HotSpot源码的源码(因为Oracle HotSpot不是开源的)。但基于此,OOP 似乎真的是对象数据结构。但在这种情况下,指针是什么?
那么问题来了:HotSpot JVM 中的 OOP 是什么?