上篇文章讲解了klassKlass的创建过程,本文将Universe::genesis(TRAPS)方法中创建的klass已图的方式进行展示.注意,其创建的方式是一致的,不同的地方是大小不同等.以下先列举一下在该方法中创建的klass.
klass名 | 作用 |
klassKlass | klass链路的末端 |
arrayKlassKlass | 是所有数组类类的抽象基类 |
objArrayKlassKlass | 是所有objArrayKlass所对应的klass |
instanceKlassKlass | 是instanceKlass所对应的klass |
typeArrayKlassKlass | 是typeArrayKlass所对应的klass |
symbolKlass | 是symbolOop所对应的klass |
typeArrayKlass | 创建了BOOLEAN,CHAR,Float,DOUBLE,BYTE,SHORT,INT,LONG所对应的数组klass |
methodKlass | 描述java类的方法 |
constMethodKlass | 描述java类方法所对应的字节码指令信息的固有属性 |
methodDataKlass | 是methodDataOop所对应的klass |
constantPoolKlass | 描述java字节码文件中的常量池的数据结构 |
constantPoolCacheKlass | constantPool 缓存所对应的klass |
compiledICHolderKlass | compiledICHolderOop 所对应的klass |
解析
arrayKlassKlass
objArrayKlassKlass
instanceKlassKlass
typeArrayKlassKlass
symbolKlass
typeArrayKlass
methodKlass
constMethodKlass
methodDataKlass
constantPoolKlass
constantPoolCacheKlass
compiledICHolderKlass
总结
可以发现,***Klass在创建的时候总是会申请oopDesc::header_size() + sizeof(***Klass)/HeapWordSize 大小的内存空间.并将_metadata 指向klassKlass.