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 |