HotSpot的对象模型(6)】的更多相关文章

接着上一篇,我们继续来讲oopDesc相关的子类. 3.instanceOopDesc类 instanceOopDesc类的实例表示除数组对象外的其它对象.在HotSpot中,对象在内存中存储的布局可以分为三块区域:对象头(header).对象字段数据(field data)和对齐填充(padding),如下图所示. 下面详细介绍一下这3个组成部分. 1.对象头 可以看到对象头分为两个部分,一个就是“Mark Word”,另外还有存储指向方法区对象类型数据的指针_klass或_compresse…
Java对象通过Oop来表示.Oop指的是 Ordinary Object Pointer(普通对象指针).在 Java 创建对象实例的时候创建,用于表示对象的实例信息.也就是说,在 Java 应用程序运行中每创建一个 Java 对象,在 JVM 内部都会创建一个 Oop 对象来表示 Java 对象.Oop涉及到的相关类的继承关系如下图所示. 1.oopDesc类 oopDesc的一个别名为oop,所以HotSpot中一般会使用oop来表示oopDesc类型. oopDesc 是 所 有 的 类…
之前多次提到接触到调用JavaCalls::call()方法来执行Java方法,如: (1)Java主类装载时,调用JavaCalls::call()方法执行的Java方法checkAndLoadMain()方法 (2)类的初始化过程中,调用JavaCalls::call()方法执行的Java方法<clinit>方法 可以看出,JavaCalls::call()方法为虚拟机调用Java方法提供了便利,Java虚拟机有invokestatic.invokedynamic.invokestatic…
前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给你答案. 1.对象的创建 对象的创建通常是通过new一个对象而已,当虚拟机接收到一个new指令时,它会做如下的操作. (1)判断对象对应的类是否加载.链接.初始化 虚拟机接收到一条new指令时,首先会去检查这个指定的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被类加载器加载.链接和初始化过.如果没…
可以将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…
在JavaMain()函数中调用LoadMainClass()函数加载Java主类.LoadMainClass()函数的实现如下: /* * Loads a class and verifies that the main class is present and it is ok to * call it for more details refer to the java implementation. */ static jclass LoadMainClass(JNIEnv *env,…
类文件解析的入口是ClassFileParser类中定义的parseClassFile()方法.上一小节得到了文件字节流stream后,接着会在ClassLoader::load_classfile()函数中调用parseClassFile()函数,调用的源代码实现如下: 源代码位置:src/share/vm/classfile/classLoader.cpp instanceKlassHandle h; if (stream != NULL) { // class file found, pa…
klassVtable与klassItable类用来实现Java方法的多态,也可以叫动态绑定,是指在应用执行期间通过判断接受对象的实际类型,根据实际类型调用对应的方法.C++为了实现多态,在对象中嵌入了虚函数表vtable,通过虚函数表来实现运行期的方法分派,这在之前介绍HotSpot的二分模型时简单介绍过,这里不再介绍C++的方法分派. 1.klassVtable类 C++中的vtable只包含虚函数,非虚函数在编译期就已经解析出正确的方法调用了.Java vtable除了虚方法外还包含了其他…
OopMapBlock是一个简单的内嵌在Klass里面的数据结构,用来描述oop中包含的引用类型属性,即该oop所引用的其他oop在oop中的内存分布,然后就可以根据当前oop的地址找到所有引用的其他oop了,其定义如下: 源代码位置:oops/instanceKlass.hpp // ValueObjs embedded in klass. Describes where oops are located in instances of // this klass. class OopMapB…