openjdk/hotspot/src/share/vm/oops/instanceKlass.hpp instanceKlass继承自Klass ,枚举ClassState 用来标识对象的加载进度。知道了OOP-Klass模型,我们就可以分析Java虚拟机是如何通过栈帧中的对象引用找到对应的对象实例,如下图所示。 从图中可以看出,通过栈帧中的对象引用找到Java堆中的instanceOopDesc对象,再通过instanceOopDesc中的元数据指针来找到方法区...
一.oop-klass的层级关系 首先,今天讲的东西是java对象在jvm层面的具体映射,它叫做oop-klass模型。咱们先来看看这个模型是怎么组成的。 从[oopsHierarchy.hpp](github.com/wxwwt/jdk7u-)的源代码,具体可以点进入到官方的github仓库里面看看,我这里放的是我fork的链接。(读者:为啥不直接放官方的链接,我:咱这不...
oop obj = klass->allocate_instance(CHECK); thread->set_vm_result(obj); IRT_END ... 上述代码片段来自HotSpot源码中new操作符的实现函数,先不深入分析每一行的具体含义,这段代码给我们最直观的功能就是:先对klass对象进行初始化工作,然后再用它来创建出oop对象。到这里我们大致就能猜出,oop表示的就是一个...
Java 对象模型(OOP-Klass模型) 一、Java 对象模型(对象头、实例数据和对齐填充 jdk1.6 对象在内存中的布局分为三块区域:对象头(Mark Word、元数据指针和数组长度)、实例数据和对齐填充。 实例对象如何存储:对象的实例存储在堆中,对象的元数据存储在元空间区,对象的引用存储在栈中。 1. Java对象头 对象头:Java...
OOP-Klass模型用来描述class的属性和行为 设计为OOP和Klass两部分是因为不希望每个对象都有一个C ++ vtbl指针, 因此,普通的oops没有任何虚拟功能。 相反,他们将所有“虚拟”函数转发到它们的klass,它具有vtbl并根据对象的实际类型执行C ++调度。 1.1 OOP ...
在《Java对象表示——Oop-Klass模型(一)》一文的最后讲到,为了实现Java方法调用的动态绑定,HotSpot使用了与C++虚函数类似的机制,同时为了避免每个对象都维护一个虚函数表,于是就设计了Klass类。 如下为HotSpot源码中对Klass的功能介绍: A Klass provides:
HotSpot中采用了OOP-Klass模型,它是用来描述Java对象实例的一种模型,OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。 HotSpot中,用instanceOopDesc 和 arrayOopDesc 来描述对象头,其中arrayOopDesc对象用于描述数组类型。
JVM使用不同的oop-klass模型来表示各种不同的对象。 而在技术落地时,这些不同的模型就使用不同的 oop 类(instanceoop methodoop constmethodoop等等)和 klass 类来表示 。由于JVM使用C/C++编写,因此这些 oop 和 klass 类便是各种不同的C++类。对于Java类型与实例对象,只叫使用 instanceOop 和 instanceKlass 这...
JVM内部基于oop-klass模型描述一个java类,将一个java类分为两个部分进行描述,其中第一个模型是oop,第二个模型是klass。 其中oop用来表示堆中的java对象实例,储存着对象实例的非静态成员变量属性,不包含任何方法;Klass用来表示java类的元数据,包含了java类中声明的方法存在于方法区;oop有klass的引用,如此多个oop实例...
oop(ordinary object pointer)用来描述对象实例信息kclass用来描述Java类,是虚拟机内部Java类型结构的对等体 JVM内部基于OOP-Klass模型描述一个Java类,将一个Java类一拆为二,第一个是oop,第二个是klass.oop是ordinary object pointer(普通对象指针), 它用来表示对象的实例信息(Java类实例对象中各个属性在运行期的值...