Java 对象头中有一个字段是 Class Pointer(对象指针),里面保存了类的继承关系(子类、父类)和类的信息(类名、修饰符、ClassLoader、注解、字段数组、方法指针数组)。
我对 字段数组 和 方法指针数组 的理解是:里面分别存放了 静态变量、成员变量、静态方法、成员方法。只是存放了变量名(或者说是变量的偏移)和方法指针。
而 Java 对象内存布局中由有一个实例数据,里面存放的是变量的实际值,例如 int i = 1,实例数据中就存放了 1。
我有两个问题:
- 上面写的这些,我理解的对不对。
- 实例数据中存放的数据会自动排序(也就是补齐),那么获取数据的时候是怎样获取的呢?
还有一个问题就是,我看别的文章中写的,静态变量和值是存放在 Class Pointer 中的,而实例变量和值是存放在 instanceOopDesc 中的。文章是这篇 【理解HotSpot虚拟机】对象在jvm中的表示:OOP-Klass模型
看仔细点,"实例变量和值是存放在 instanceOopDesc"这句就让我懵了...
instanceOopDesc就是对象头,里面包含元数据指针,指向方法区,
方法区存放静态变量和方法
实例变量跟随obj放在堆里