`
李静波
  • 浏览: 53809 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

相关推荐

    Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser

    标题 "Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser" 提示了一个Java运行时错误,这通常意味着在尝试加载或初始化`JRStyledTextParser`类时遇到了问题。`JRStyledTextParser`是...

    CRC.rar_CSharp CRC_class_crc_crc32

    标题"CRC.rar_CSharp CRC_class_crc_crc32"表明这个压缩包包含了一个名为"CRC.cs"的C#源代码文件,该文件实现了一个CRC32校验的类。 CRC32是一种基于多项式除法的校验技术,通过计算数据的二进制位串与特定的CRC...

    sheep ai.py

    发帖求助 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

    java串口所需依赖dll文件合集

    监听COM口启动程序报错 Could not initialize class gnu.io.RXTXCommDriver异常 是因为需要在%JAVA_HOME%/jre/bin目录中添加rxtxParallel.dll、rxtxSerial.dll文件

    jacob_1.14.3.rar

    内涵jacob_1.14.3-x64.dll;jacob_1.14.3-64.jdk(maven地址);解决方法:Could not initialize class com.jacob.com.ComThread

    aA_Classwork

    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环境下报NoClassDefFound问题

    解决hbase client在windows环境下报Could not initialize class org.fusesource.jansi.internal.Kernel32的问题,把jar包放入hbase client的lib包下,重新运行hbase.cmd shell即可

    thinkPHP中_initialize方法实例分析

    当`IndexAction`被实例化时,会先调用`BaseAction`的`_initialize`,输出"Base class",然后执行`IndexAction`自己的`_initialize`,输出"hello I am child"。因此,最终的输出是"Base class hello I am child"。 ...

    linux上实现视频截图

    public class VideoScreenshot { public static void main(String[] args) { String videoFilePath = "/path/to/your/video"; String screenshotPath = "/path/to/screenshot.png"; // 打开视频文件 avformat....

    attr_extras:使用attr_initialize之类的方法从Ruby中获取一些样板

    attr_extras 从Ruby中删除一些样板,...class InvoicePolicy def initialize ( invoice , company : ) @invoice = invoice @company = company end def payable? some_logic ( invoice , company ) end priva

    Mootools 1.2教程(21)——类(二)

    initialize: function(input) { this.inputVariable = input; }, testFunction: function() { alert('BaseClass.testFunction() : ' + this.inputVariable); }, definedVariable: "Defined in BaseClass" });...

    Classfor的用法

    2. **三参数版本**:`Class.forName(String className, boolean initialize, ClassLoader loader)` - `className`:待加载的类的全限定名。 - `initialize`:是否初始化该类,默认为 `true`。如果为 `false`,则...

    qiconengineplugin.rar_The Class

    通常,插件需要实现`QIconEnginePlugin::initialize()`和`QIconEnginePlugin::create(const QString &name)`这两个关键函数。`initialize()`用于初始化插件,而`create()`则根据传入的名称创建并返回一个QIconEngine...

    ezmorph-1.0.6.jar

    缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig 使用json时候将会用到的一个jar包,发现这个包在网上提供的比较少.缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig ...

    derby.jar 。。

    java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40 导致的原因: 在azkaban的server和executor中缺少一个叫derby.jar的包

    Lazy.Object.Initialize

    public class MyClass { private readonly Lazy<MyExpensiveObject> _lazyInstance = new Lazy(() => new MyExpensiveObject()); public MyExpensiveObject Instance => _lazyInstance.Value; } ``` 在这里,`...

    attr_extras, 使用attr_initialize之类的方法从 ruby 中取出一些样板.zip

    attr_extras, 使用attr_initialize之类的方法从 ruby 中取出一些样板 attr_extras从 ruby 中提取一些样板,降低了提取小型聚焦类的障碍,而不考虑使用 Struct 函数...代替class InvoiceBuilder def initialize(invoice

    gnu.io.rar_android_gnu.io _librxtxSerial_librxtxSerial._librxtxS

    在Android平台上进行串口通信开发时,常常会遇到需要与硬件设备进行低级别交互的情况,例如读写传感器数据、控制外部设备等。标题中的“gnu.io.rar_android_gnu.io _librxtxSerial_librxtxSerial._librxtxS”提到了`...

    ThinkPHP中__initialize()和类的构造函数__construct()用法分析

    与标准的`__construct()`不同,`__initialize()`在ThinkPHP中通常用于处理子类继承时的初始化逻辑,避免在每个子类中都显式调用`parent::__construct()`。 在PHP中,类的初始化过程遵循以下规则: 1. 如果一个子类...

    freetype库和示例代码

    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; } ...

Global site tag (gtag.js) - Google Analytics