oop 对象 klass 类的元信息 看下klass模型类的继承结构 从继承关系上也能看出来,类的元信息是存储在原空间(MetespaceObj)。 1.1.1 InstanceKlass InstanceKlass:普通的Java类在JVM中对应的是instanceKlass类的实例。(形象理解)类加载器将.class文件加载进jvm,将.class文件解析,把类的元信息存储在JVM InstanceKlass...
当加载一个Class时,会创建一个InstanceKlass对象,实例化的对象则对应InstanceOopDesc,instanceOopDesc继承自oopDesc,用于表示普通的Java对象,每次new一个Java对象就会创建一个新的instanceOopDesc实例,其中InstanceKlass存放在元空间,InstanceOopDesc存放在堆中。 由于Java 8 引入了 Metaspace,OpenJDK1.8 里对象模型的实现与...
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及其...
Klass* _klass; // 采用指针压缩技术时使用 narrowKlass _compressed_klass; } _metadata; ... } _mark和_metadata被称为对象头,其中前者存储对象的运行时记录信息;后者是一个指针,指向当前对象所属的Klass对象。 因为某些历史原因,HotSpot把markOop放到Oop体系里,但是它并继承oop,因此前文所描述的Oop体系并没有...
1、JVM中OOP-KLASS模型 在JVM中,使用了OOP-KLASS模型来表示java对象,即: 1.jvm在加载class时,会创建instanceKlass,表示其元数据,包括常量池、字段、方法等,存放在方法区;instanceKlass是jvm中的数据结构; 2.在new一个对象时,jvm创建instanceOopDesc,来表示这个对象,存放在堆区,其引用,存放在栈区;它用来表示对象...
OOP-Klass模型 java中每个类在JVM中都有一个Klass类的实例与之相对应,存储类的元数据信息:常量池、属性信息、方法信息等等... Klass模型的继承结构如下 klass模型继承结构 从类的继承结构可以看出类的元数据信息是存储在元空间的。 普通的Java在JVM中对应的是InstanceKlass实例,再看下对应的3个子类 1、Instance...
在《Java对象表示——Oop-Klass模型(一)》一文的最后讲到,为了实现Java方法调用的动态绑定,HotSpot使用了与C++虚函数类似的机制,同时为了避免每个对象都维护一个虚函数表,于是就设计了Klass类。 如下为HotSpot源码中对Klass的功能介绍: A Klass provides:
instanceKlass继承自Klass ,枚举ClassState 用来标识对象的加载进度。 知道了OOP-Klass模型,我们就可以分析Java虚拟机是如何通过栈帧中的对象引用找到对应的对象实例,如下图所示。 从图中可以看出,通过栈帧中的对象引用找到Java堆中的instanceOopDesc对象,再通过instanceOopDesc中的元数据指针来找到方法区中的instanceKlass...
HotSpot中采用了OOP-Klass模型,它是用来描述Java对象实例的一种模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。 HotSpot中,用instanceOopDesc 和 arrayOopDesc 来描述对象头,其中arrayOopDesc对象用于描述数组类型。