首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >普通对象指针是HotSpot中的指针还是对象结构?

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

Stack Overflow用户
提问于 2016-12-30 20:58:27
回答 1查看 1.5K关注 0票数 9

我正在编写一篇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中的面向对象程序是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-30 23:28:12

来自oop.hpp源代码的HotSpot:

代码语言:javascript
复制
class oopDesc {
  friend class VMStructs;
 private:
  volatile markOop  _mark;
  union _metadata {
    Klass*      _klass;
    narrowKlass _compressed_klass;
  } _metadata;

...

oopsHierarchy.hpp

代码语言:javascript
复制
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的托管引用。这基本上是另一个层次的间接。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41402624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档