HotSpot中采用了OOP-Klass模型,它是用来描述Java对象实例的一种模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。 HotSpot中,用instanceOopDesc 和 arrayOopDesc 来描述对象头,其中arrayOopDesc对象用于描述数组类型。 instanceOopDesc的代码如下所示。 openjdk/hotspot/src/share...
不同于Oop,Klass在InstanceKlass下又设计了3个子类,其中InstanceMirrorKlass用于表示java.lang.Class类型,该类型对应的oop特别之处在于其包含了static field,因此计算oop大小时需要把static field也考虑进来;InstanceClassLoaderKlass主要提供了遍历当前ClassLoader的继承体系;InstanceRefKlass用于表示java.lang.ref.Reference及其...
oop 对象 klass 类的元信息 看下klass模型类的继承结构 从继承关系上也能看出来,类的元信息是存储在原空间(MetespaceObj)。 1.1.1 InstanceKlass InstanceKlass:普通的Java类在JVM中对应的是instanceKlass类的实例。(形象理解)类加载器将.class文件加载进jvm,将.class文件解析,把类的元信息存储在JVM InstanceKlass...
在撸源码之前首先科普下JVM的OOP-Klass模型: JVM内部基于oop-klass模型描述一个java类,将一个java类分为两个部分进行描述,其中第一个模型是oop,第二个模型是klass,其中oop用来表示堆中的java对象实例,储存着对象实例的非静态成员变量属性,不包含任何方法;Klass用来表示java类的元数据,包含了java类中声明的方法存在于...
OOP-Klass 模型是对象在JVM中的表示 Klass Klass: 包含元数据和方法信息,用来描述Java类 Klass主要有两个功能: 实现语言层面的Java类 实现Java对象的分发功能 一般jvm在加载class文件时,会在方法区创建instanceKlass,表示其元数据,包括常量池、字段、方法等。
一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的。 JVM内部基于oop-klass模型描述一个java类以及其实例(对象),java类元信息用klass描述,对象用oop来描述。
二、Java对象模型-OOP-Klass 在JVM中,Hotspot并没有将Java对象映射成C++对象,而是实现了Java的对象模型(OOP-Klass),JVM不希望每个对象中都包含一份虚函数表(Why???待探究)。 那么为何要设计这样一个一分为二的对象模型呢?这是因为 HotSopt JVM 的设计者不想让每个对象中都含有一个 vtable(虚函数表),所以就把...
HotSpot中采用了OOP-Klass模型,它是用来描述Java对象实例的一种模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。 HotSpot中,用instanceOopDesc 和 arrayOopDesc 来描述对象头,其中arrayOopDesc对象用于描述数组类型。
klass.hpp翻译: Klass是klassoop的一部分,它提供了: 1.语言层面的java类对象(方法字典等) 2.为该对象提供了虚拟机的调度行为 这两个功能完成了一个C++类的功能。顶层的Klass实现第一点,而所有子类提供额外的虚拟功能实现了第二点。 因此,java的oop-klass对象模型中,klass和其子类就实现了C++对象中的这两个功能...
在《Java对象表示——Oop-Klass模型(一)》一文的最后讲到,为了实现Java方法调用的动态绑定,HotSpot使用了与C++虚函数类似的机制,同时为了避免每个对象都维护一个虚函数表,于是就设计了Klass类。 如下为HotSpot源码中对Klass的功能介绍: A Klass provides: