跳转至

JVM学习

Java面相对象的底层表现形式

HotSpot采用oop-Klass模型表示Java的面相对象和类。oop(ordinary object pointer)指普通的对象指针,Klass表示对象的具体类型。

Klass

Klass类继承MetaDat12a,Klass类的结构如下

字段名 类型 说明
_layout_helper jint(int) 对象布局的总和描述符,如果不是对象或者数组(比如常量池),这个值为0,否则这个值将代表4个组合数,组合数具体有什么含义有子类实现
_name Symbol (char) 类名
_primary_supers Klass*[](Klass指针数组) 表示当前类的父类的继承链,默认长度为8,可以通过-XX:FastSuperclassLimit=5将限制改为5。当超出限度时,超出的部分会放入_secondary_supers中。
例如当前类A继承B,B继承C,那么数组中存放的就是{A,B,C}
_java_mirror oop(oopDesc*类型) 保存当前Klass实例在Java类所对应的java.lang.Class的对象,可以据此访问静态属性
_super_check_offset juint(unsigned int) 指向继承链中自己的位置与自己实例的其实地址的偏移量。比如上面的例子中,这个值就是(2+primary_supers偏移量) , 因为 primary_supers[2]中的指正指向的就是A的Klass。
当继承链大于8时,他的值就和_secondary_super_cache一样
_secondary_supers Array *
(可动态变化的数组指针)
一般存储Java类实现的接口,偶尔还会存储Java类以及其父类
_secondary_supers_cache Klass* 保存上一次查询父类的结果
_super Klass* 指向Java类的直接父类
_subklass Klass* 指向Java类的直接子类,多个子类会通过_next_sibling连接起来
_next_sibling Klass* 获取当前类的兄弟子类(二者直接继承同一个父类)
_next_link Klass* 指向ClassLoader加载的下一个Klass
_class_loader_data ClassLoaderData* 通过此属性找到加载该Java类的ClassLoader
_access_flags AccessFlags 权限修饰符,比如private、final、static、abstract、native等
_prototype_header markOop 和锁的实现有关
_modified_oops jbyte(byte) 和GC实现有关,可用于YC、CMS
_accumulated_modified_oops jbyte(byte) 和GC有关,仅用于CMS

Metadata
Metadata
Klass
Klass
InstanceKlass
InstanceKlass
ArrayKlass
ArrayKlass
InstanceMirrorKlass
InstanceMirrorKlass
InstanceClassLoadKlass
InstanceClassLoadKlass
InstanceRefKlass
InstanceRefKlass
TypeArrayKlass
TypeArrayKlass
ObjArrayKlass
ObjArrayKlass
ConstantPool
ConstantPool
Text is not SVG - cannot display