关于 Java 对象内存布局中字段的保存与值保存的问题

user_Lyb4cBn8
  • 1
新手上路,请多包涵

Java 对象头中有一个字段是 Class Pointer(对象指针),里面保存了类的继承关系(子类、父类)和类的信息(类名、修饰符、ClassLoader、注解、字段数组、方法指针数组)。

我对 字段数组 和 方法指针数组 的理解是:里面分别存放了 静态变量、成员变量、静态方法、成员方法。只是存放了变量名(或者说是变量的偏移)和方法指针。

而 Java 对象内存布局中由有一个实例数据,里面存放的是变量的实际值,例如 int i = 1,实例数据中就存放了 1。

我有两个问题:

  1. 上面写的这些,我理解的对不对。
  2. 实例数据中存放的数据会自动排序(也就是补齐),那么获取数据的时候是怎样获取的呢?

还有一个问题就是,我看别的文章中写的,静态变量和值是存放在 Class Pointer 中的,而实例变量和值是存放在 instanceOopDesc 中的。文章是这篇 【理解HotSpot虚拟机】对象在jvm中的表示:OOP-Klass模型

回复
阅读 420
2 个回答
MOON
  • 3
新手上路,请多包涵

看仔细点,"实例变量和值是存放在 instanceOopDesc"这句就让我懵了...
instanceOopDesc就是对象头,里面包含元数据指针,指向方法区,
方法区存放静态变量和方法
实例变量跟随obj放在堆里

大差不差吧,class pointer 明显是 指向方法区的 class 信息,里面存放的 常量池,字段表,方法表,属性表,等等。而class 在准备阶段会初始化 static 相关的默认属性值,初始化复制 其确认值。实例对象放于堆中,里面存放和实例有关的信息,比如 非static 的一些字段。

你知道吗?

宣传栏