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是什么?
来自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)
typedef class oopDesc* oop;
Run Code Online (Sandbox Code Playgroud)
名称OOP(普通对象指针)代表了自己:它是对象的指针或引用。oopDesc
是描述oop指向的对象格式的结构。它是oopDesc,其中包含标记词和Klass指针。
甲正常(宽)OOP在堆中的对象的只是一个普通的地址。
甲压缩(窄)接力是编码的地址。
还有一个oop handle的概念-对在GC中遍历和更新的oop的托管引用。基本上,它是间接的另一层。
归档时间: |
|
查看次数: |
861 次 |
最近记录: |