我正在编写一篇Oracle和GC内部文章,但我对OOP (普通对象指针)的含义感到困惑。
Oracle文档声明OOP是指向堆上的对象数据结构的32或64位指针:
"oop",即Java Hotspot术语中的普通对象指针,是指向对象的托管指针。oop通常与本机指针的大小相同。
它可以压缩,但这是除了问题。
我想找到关于这个数据结构的文章,但是后来混乱开始了。
有些文章说OOP实际上是数据结构本身,而不是指针!
在这一点上,其他一些文章似乎自相矛盾,比如论infoq.com。首先,它声明OOP是一个指针:
OOP是C/ C++意义上的真正指针--一个机器单词,它指向Java堆中的内存位置。
但在那之后,它说:
OOP由两个标题的机器单词组成,它们称为Mark和Klass单词,后面跟着这个实例的成员字段。
那么指针由标头和成员字段组成吗?那不可能是真的。
最后,我尝试查看Oracle和OpenJDK HotSpot源代码的源代码(因为Oracle不是开源的)。但基于此,OOP似乎是真正的对象数据结构。但在这种情况下,指针是什么?
所以问题是:,HotSpot JVM中的面向对象程序是什么?
发布于 2016-12-30 23:28:12
来自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所指向对象的格式的结构。oopDesc包含标记词和Klass指针。
普通(宽) oop只是堆中对象的简单地址。
压缩(窄) oop是一个编码地址。
还有一个http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/5d69e782dd37/src/share/vm/runtime/handles.hpp#l30的概念--对在GC期间遍历和更新的oop的托管引用。这基本上是另一个层次的间接。
https://stackoverflow.com/questions/41402624
复制相似问题