initialize_class函数位于:\hotspot\src\share\vm\runtime\Thread.cpp
作用:完成一个java class从磁盘文件加载到JVM内部数据结构(oop)这一个过程。
作用:完成一个java class从磁盘文件加载到JVM内部数据结构(oop)这一个过程。
先看它的定义
static void initialize_class(symbolHandle class_name, TRAPS)
第一个参数class_name,是一个Handle,对对应要加载的class。
第二个参数是TRAPS,是当前的Thread和异常处理代码,参见 这里。
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的内部存储形式。
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
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文件。
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包含了及其丰富的内容,这次只是一个开头。
initialize_class包含了及其丰富的内容,这次只是一个开头。