initialize_class

initialize_class函数位于:\hotspot\src\share\vm\runtime\Thread.cpp
作用:完成一个java class从磁盘文件加载到JVM内部数据结构(oop)这一个过程。
 
先看它的定义
static void initialize_class(symbolHandle class_name, TRAPS)
第一个参数class_name,是一个Handle,对对应要加载的class。
第二个参数是TRAPS,是当前的Thread和异常处理代码,参见这里
 
那么class loader在哪里?initialize_class用的是VM自身的class loader。
 
再看看initialize_class的实现
static void initialize_class(symbolHandle class_name, TRAPS) {
  klassOop klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK);
  instanceKlass::cast(klass)->initialize(CHECK);
}
其逻辑是:先从SystemDictionary中查找class_name对应的klassOop,然后再利用klassOop初始化instanceKlass的内部数据。
klassOop是java.lang.Class的内部存储形式。
 
我们先来看SystemDictionary::resolve_or_fail的实现。
resolve_or_fail的调用其他函数显得很是复杂,在初次阅读的时候,我们先不细究。
主题逻辑是:根据class_name来判断该class是instance还是array。
这里我们也只是先看class是instance时的情况。
SystemDictionary::resolve_or_fail
  |
  |--> SystemDictionary::resolve_instance_class_or_null
            |
            |--> SystemDictionary::load_instance_class
                  |
                  |--> ClassLoader::load_classfile
                          |
                          |--> ClassFileParser::parseClassFile
 
  其中ClassFileParser::parseClassFile从ClassFileStream中获得java class file的byte流。
  ClassFileStream则负责从磁盘中load .class文件。
 

再来看instanceKlass::cast(klass)->initialize(CHECK)的实现。
首先instanceKlass::cast是有klassOop获得instanceKlassOop的标准途径。
instanceKlass::cast(klass)->initialize
   |
   |--> instanceKlass::initialize_impl
instanceKlass::initialize_impl的算法见Java Virtual Machine Specification 2.17.5
 一共分为11个Step。
 
总结一下
initialize_class包含了及其丰富的内容,这次只是一个开头。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值