源码
klassOop是klassOopDesc的指针

那klassOopDesc又是个啥?

如源码中注释所述,klassOopDesc是C++对Java类的描述,其中包含了一个Klass。
Java对象在内存中的结构

这幅图其实有些误导,其中的instanceKlass等等其实应该是klassOop,估计是写不下了,省略了吧。
再如下图,hsdb也有些误导,Oop的_metadata._klass指向的应该是klassOop:

组合
klassOop与其包含的Klass是如何相互引用的?通过如下,两个函数:


原理
jdk8之前,方法区内描述类型的元数据对象klass,也由GC管理。而由GC管理的对象,必须都继承自oopDesc,所有才会有klassOopDesc做为Klass的替身。jdk8中就没有这个必要了。
网友评论