HotSpot二分模型(1)】的更多相关文章

HotSpot采用了OOP-Klass模型来描述Java类和对象.OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型. 那么为何要设计这样一个一分为二的对象模型呢?因为类和对象本来就不是一个概念,分别使用不同的对象模型描述符合软件开发的设计思想.另外英文注释也说明了其中的一个原因: One reason for the oop/klass dichotomy in the implementation is that we don't…
上一篇分析了 HotSpot类模型之InstanceKlass ,这次主要分析表示java数组类型的C++类. 1.ArrayKlass类 ArrayKlass继承自Klass,是所有数组类的抽象基类,类及重要属性的定义如下: class ArrayKlass: public Klass { ... private: int _dimension; // This is n'th-dimensional array. Klass* volatile _higher_dimension; // R…
上一篇 HotSpot源码分析之类模型 介绍了类模型的基础类Klass的重要属性及方法,这一篇介绍一下InstanceKlass及InstanceKlass的子类. 1.InstanceKlass类 每个InstanceKlass对象表示一个具体的Java类(这里的Java类不包括Java数组).InstanceKlass类及重要属性的定义如下: class InstanceKlass: public Klass { ... protected: // Annotations for this…
在前一篇文章 HotSpot的二分模型中已经讲过,HotSpot采用了OOP-Klass模型描述Java的类和对象.Klass模型采用Klass类及相关子类来表示具体的Java类,可以理解这些类为Java类在C++ 中的对等体.一般 JVM 在加载 Class 文件时,会在方法区创建 Klass ,表示类的元数据,包括常量池.字段.方法等. 相关类的继承体系如下图所示. Metadata是元数据类的基础类型,除了Klass会直接继承外,表示方法的Method与表示常量池的ConstantPool…
上一篇 HotSpot的类模型(2) 介绍了类模型的基础类Klass的重要属性及方法,这一篇介绍一下InstanceKlass及InstanceKlass的子类. 2.InstanceKlass类 每个InstanceKlass对象表示一个具体的Java类(这里的Java类不包括Java数组).InstanceKlass类及重要属性的定义如下: class InstanceKlass: public Klass { ... protected: // Annotations for this c…
我们继续接着上一篇 HotSpot的类模型(3)分析,这次主要分析表示java数组的C++类. 4.ArrayKlass类 ArrayKlass继承自Klass,是所有数组类的抽象基类,类及重要属性的定义如下: class ArrayKlass: public Klass { ... private: int _dimension; // This is n'th-dimensional array. Klass* volatile _higher_dimension; // Refers th…
接着上一篇,我们继续来讲oopDesc相关的子类. 3.instanceOopDesc类 instanceOopDesc类的实例表示除数组对象外的其它对象.在HotSpot中,对象在内存中存储的布局可以分为三块区域:对象头(header).对象字段数据(field data)和对齐填充(padding),如下图所示. 下面详细介绍一下这3个组成部分. 1.对象头 可以看到对象头分为两个部分,一个就是“Mark Word”,另外还有存储指向方法区对象类型数据的指针_klass或_compresse…
之前多次提到接触到调用JavaCalls::call()方法来执行Java方法,如: (1)Java主类装载时,调用JavaCalls::call()方法执行的Java方法checkAndLoadMain()方法 (2)类的初始化过程中,调用JavaCalls::call()方法执行的Java方法<clinit>方法 可以看出,JavaCalls::call()方法为虚拟机调用Java方法提供了便利,Java虚拟机有invokestatic.invokedynamic.invokestatic…
可以将Handle理解成访问对象的一个“句柄”.垃圾回收时对象可能被移动(对象地址发生改变),通过Handle访问对象可以对使用者屏蔽垃圾回收细节. Handle涉及到的相关类的继承关系如下图所示. HotSpot会通过Handle对Oop和某些Klass进行操作.下图左边显示了直接访问的情况,下图右边显示了间接访问的情况. 可以看到,当对Oop直接引用时,如果Oop的地址发生变化,那么所有的引用都要更新,如图有3处引用,所以都需要更新:当通过Handle对Oop间接引用时,如果Oop的地址发生…
本篇首先介绍几个与句柄分配与释放密切相关的类,然后重点介绍句柄的释放. 1.HandleArea.Area与Chunk 句柄都是在HandleArea中分配并存储的,类的定义如下: // Thread local handle area class HandleArea: public Arena { friend class HandleMark; ... HandleArea* _prev; // HandleArea通过_prev连接成单链表 public: // Constructor…