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

问题描述 投票:0回答:1

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

java pointers jvm jvm-hotspot
1个回答
13
投票

oop.hpp 来自 HotSpot 源代码:

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

A

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

还有一个

oop 句柄的概念 - 对 GC 期间遍历和更新的 oop 的托管引用。它基本上是多一层间接。

© www.soinside.com 2019 - 2024. All rights reserved.