上篇文章讲解了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.