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

时间:2016-12-30 20:58:27

标签: java pointers jvm hotspot

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

1 个答案:

答案 0 :(得分:3)

来自HotSpot源代码的

oop.hpp

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 指向的对象格式的结构。 oopDesc 包含标记字和Klass指针。

普通(宽)oop 只是堆中对象的普通地址。
压缩(窄)oop 是编码地址。

还有oop handle的概念 - 对GC期间遍历和更新的oop的管理引用。它基本上是一个间接层次。