9

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

4

1 回答 1

11

来自 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 句柄的概念- 对在 GC 期间遍历和更新的 oop 的托管引用。它基本上是一个间接级别。

于 2016-12-30T23:28:12.427 回答