普通对象指针是HotSpot中的指针还是对象结构?

Rob*_*ert 4 java pointers jvm hotspot

我正在撰写有关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什么?

apa*_*gin 5

来自HotSpot源代码的oop.hpp

class oopDesc {
  friend class VMStructs;
 private:
  volatile markOop  _mark;
  union _metadata {
    Klass*      _klass;
    narrowKlass _compressed_klass;
  } _metadata;

...
Run Code Online (Sandbox Code Playgroud)

oopsHierarchy.hpp

typedef class oopDesc*    oop;
Run Code Online (Sandbox Code Playgroud)

名称OOP普通对象指针)代表了自己:它是对象的指针引用oopDesc是描述oop指向的对象格式的结构。它是oopDesc,其中包含标记词和Klass指针。

正常(宽)OOP在堆中的对象的只是一个普通的地址。
压缩(窄)接力是编码的地址。

还有一个oop handle的概念-对在GC中遍历和更新的oop的托管引用。基本上,它是间接的另一层。