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包含了及其丰富的内容,这次只是一个开头。

你可能感兴趣的:(jvm,thread,数据结构,算法,oop)