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包含了及其丰富的内容,这次只是一个开头。
分享到:
相关推荐
标题 "Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser" 提示了一个Java运行时错误,这通常意味着在尝试加载或初始化`JRStyledTextParser`类时遇到了问题。`JRStyledTextParser`是...
标题"CRC.rar_CSharp CRC_class_crc_crc32"表明这个压缩包包含了一个名为"CRC.cs"的C#源代码文件,该文件实现了一个CRC32校验的类。 CRC32是一种基于多项式除法的校验技术,通过计算数据的二进制位串与特定的CRC...
发帖求助 Traceback (most recent call last): File "C:/Users/DELL/Desktop/sheep ai.py", line 6, in sheep=ChatBot("艾酪") File "C:\Users\DELL\AppData\Local\... self.storage = utils.initialize_class(sto
监听COM口启动程序报错 Could not initialize class gnu.io.RXTXCommDriver异常 是因为需要在%JAVA_HOME%/jre/bin目录中添加rxtxParallel.dll、rxtxSerial.dll文件
内涵jacob_1.14.3-x64.dll;jacob_1.14.3-64.jdk(maven地址);解决方法:Could not initialize class com.jacob.com.ComThread
def initialize(name, age) @name = name @age = age end def display_info puts "Name: #{@name}, Age: #{@age}" end end student = Student.new("Alice", 20) student.display_info ``` 此外,他们可能...
解决hbase client在windows环境下报Could not initialize class org.fusesource.jansi.internal.Kernel32的问题,把jar包放入hbase client的lib包下,重新运行hbase.cmd shell即可
当`IndexAction`被实例化时,会先调用`BaseAction`的`_initialize`,输出"Base class",然后执行`IndexAction`自己的`_initialize`,输出"hello I am child"。因此,最终的输出是"Base class hello I am child"。 ...
public class VideoScreenshot { public static void main(String[] args) { String videoFilePath = "/path/to/your/video"; String screenshotPath = "/path/to/screenshot.png"; // 打开视频文件 avformat....
attr_extras 从Ruby中删除一些样板,...class InvoicePolicy def initialize ( invoice , company : ) @invoice = invoice @company = company end def payable? some_logic ( invoice , company ) end priva
initialize: function(input) { this.inputVariable = input; }, testFunction: function() { alert('BaseClass.testFunction() : ' + this.inputVariable); }, definedVariable: "Defined in BaseClass" });...
2. **三参数版本**:`Class.forName(String className, boolean initialize, ClassLoader loader)` - `className`:待加载的类的全限定名。 - `initialize`:是否初始化该类,默认为 `true`。如果为 `false`,则...
通常,插件需要实现`QIconEnginePlugin::initialize()`和`QIconEnginePlugin::create(const QString &name)`这两个关键函数。`initialize()`用于初始化插件,而`create()`则根据传入的名称创建并返回一个QIconEngine...
缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig 使用json时候将会用到的一个jar包,发现这个包在网上提供的比较少.缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig ...
java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40 导致的原因: 在azkaban的server和executor中缺少一个叫derby.jar的包
public class MyClass { private readonly Lazy<MyExpensiveObject> _lazyInstance = new Lazy(() => new MyExpensiveObject()); public MyExpensiveObject Instance => _lazyInstance.Value; } ``` 在这里,`...
attr_extras, 使用attr_initialize之类的方法从 ruby 中取出一些样板 attr_extras从 ruby 中提取一些样板,降低了提取小型聚焦类的障碍,而不考虑使用 Struct 函数...代替class InvoiceBuilder def initialize(invoice
在Android平台上进行串口通信开发时,常常会遇到需要与硬件设备进行低级别交互的情况,例如读写传感器数据、控制外部设备等。标题中的“gnu.io.rar_android_gnu.io _librxtxSerial_librxtxSerial._librxtxS”提到了`...
与标准的`__construct()`不同,`__initialize()`在ThinkPHP中通常用于处理子类继承时的初始化逻辑,避免在每个子类中都显式调用`parent::__construct()`。 在PHP中,类的初始化过程遵循以下规则: 1. 如果一个子类...
printf("Failed to initialize FreeType library.\n"); return 1; } // 打开字体文件 if (FT_New_Face(library, "path/to/font.ttf", 0, &face)) { printf("Failed to open font file.\n"); return 1; } ...