HotSpot中采用了OOP-Klass模型,它是用来描述Java对象实例的一种模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。 HotSpot中,用instanceOopDesc 和 arrayOopDesc 来描述对象头,其中arrayOopDesc对象用于描述数组类型。 instanceOopDesc的代码如下所示。 openjdk/hotspot/src/share...
oop 对象 klass 类的元信息 看下klass模型类的继承结构 从继承关系上也能看出来,类的元信息是存储在原空间(MetespaceObj)。 1.1.1 InstanceKlass InstanceKlass:普通的Java类在JVM中对应的是instanceKlass类的实例。(形象理解)类加载器将.class文件加载进jvm,将.class文件解析,把类的元信息存储在JVM InstanceKlass...
oop obj = klass->allocate_instance(CHECK); thread->set_vm_result(obj); IRT_END ... 上述代码片段来自HotSpot源码中new操作符的实现函数,先不深入分析每一行的具体含义,这段代码给我们最直观的功能就是:先对klass对象进行初始化工作,然后再用它来创建出oop对象。到这里我们大致就能猜出,oop表示的就是一个...
当加载一个Class时,会创建一个InstanceKlass对象,实例化的对象则对应InstanceOopDesc,instanceOopDesc继承自oopDesc,用于表示普通的Java对象,每次new一个Java对象就会创建一个新的instanceOopDesc实例,其中InstanceKlass存放在元空间,InstanceOopDesc存放在堆中。 由于Java 8 引入了 Metaspace,OpenJDK1.8 里对象模型的实现与...
在《Java对象表示——Oop-Klass模型(一)》一文的最后讲到,为了实现Java方法调用的动态绑定,HotSpot使用了与C++虚函数类似的机制,同时为了避免每个对象都维护一个虚函数表,于是就设计了Klass类。 如下为HotSpot源码中对Klass的功能介绍: A Klass provides:
一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的。 JVM内部基于oop-klass模型描述一个java类以及其实例(对象),java类元信息用klass描述,对象用oop来描述。
OOP-Klass模型用来描述class的属性和行为 设计为OOP和Klass两部分是因为不希望每个对象都有一个C ++ vtbl指针, 因此,普通的oops没有任何虚拟功能。 相反,他们将所有“虚拟”函数转发到它们的klass,它具有vtbl并根据对象的实际类型执行C ++调度。 1.1 OOP ...
instanceKlass继承自Klass ,枚举ClassState 用来标识对象的加载进度。 知道了OOP-Klass模型,我们就可以分析Java虚拟机是如何通过栈帧中的对象引用找到对应的对象实例,如下图所示。 从图中可以看出,通过栈帧中的对象引用找到Java堆中的instanceOopDesc对象,再通过instanceOopDesc中的元数据指针来找到方法区中的instanceKlass...
了第二点. 因此.java的oop-klass对象模型中,klass和其子类就实现了C++对象中的这两个功能. 在实现对象模型中出现oop/klass二分法的一个原因是我们不希望每个对象都有一个C++...。 3.oopDesc是抽象的。(完整的类层次结构见oopHierarchy). 4.oop类不允许虚拟功能. 我们可以将oop的部分理解成java部分的对象,然后...
Klass 中对应的是: instanceKlass : 在虚拟机层面描述一个 Java 类 OOP 源码 首先看oopsHierarchy.hpp文件中,可以看到在 OpenJDK 的源码中都是用 oopDesc* 等 Desc* 来表示的。 在虚拟机内部,通过instanceOop来表示一个 Java 对象,对象在内存中的布局可以分为连续的两部分,instanceOopDesc和实例数据 ...