JVM 内部的 Java 类和对象的结构与访问机制分析

一、OOP-Klass 对象系统:JVM 内部的 Java 类与对象实现

  • JVM是基于 C++ 实现的,故 Java 的每个类被 JVM 加载之后,需要使用一个 C++ 的对等体来维护,同时Java对象实例也需要在C++中能够被访问,JVM的实现机制为OOP-Klass,其中 OOP 是针对一个Java 对象实例而言的,而 Klass 则是针对一个 Java 类而言的,具体为:
  1. OOP: Java 对象指针,用来指向 Java 对象实例;
  2. Klass:Java 类的 C++ 对等体,用来描述 Java 类的信息。

二、Java 对象的内存结构

  • 每个 Java 对象包含对象头和实例数据两部分,内存结构为连续内存,具体如图:(图片均引自《 Hotspot 实战》)
JVM 内部的 Java 类和对象的结构与访问机制分析

  • 实例数据就是 Java 对象的成员属性的数据,而对象头由 Mark Word 和元数据指针两部分组成:

(1)Mark Word:记录对象的运行时状态信息(哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等),如下:

JVM 内部的 Java 类和对象的结构与访问机制分析

(2)元数据指针:指向该 Java 对象实例所属的 Java 类对应的 Klass 对象 instanceKlass,其中 Klass 对象 instanceKlass 存储了该对象实例所属 Java 类的元数据信息,instanceKlass 对象存放在方法区中。虚拟机在运行过程中通过该 klass 对象指针去方法区获取该包含 Java 类元数据信息的 instanceKlass 对象。

三、Java 对象引用 OOP,Java 对象与 Java 类的关系:JVM 内存分布与 JVM对象访问机制

  • Java 对象引用 OOP 位于栈中,Java 对象实例(包含对象头和实例数据,其中实例数据为对象实例的字段数据)位于堆中,Java 对象所属 Java 类的类对象 instanceKlass(包含对象方法和类变量等信息)位于方法区中。
  • 这三者的访问机制如图:

(1)Java 对象引用位于栈中,包含指向堆中的 Java 对象实例的指针,从而可以访问 Java 对象实例。

(2)Java 对象实例由对象头和实例数据两部分组成,其中对象头中包含元数据指针,通过元数据指针访问方法区的 Java 类元数据对象 instanceKlass。

JVM 内部的 Java 类和对象的结构与访问机制分析


分享到:


相關文章: