JVM 学习笔记 2 : 类加载器

本文详细介绍了JVM的类加载器工作原理,包括双亲委派模型、类加载器的层次结构以及loadClass()方法的实现过程。通过分析Java系统类加载器的获取方法和类查找的内部实现,揭示了如何从启动类加载器到应用类加载器进行类的查找和加载。
摘要由CSDN通过智能技术生成
// 源代码位置:
// openjdk8/hotspot/src/share/vm/classfile/systemDictionary.cpp
oop SystemDictionary::_java_system_loader = NULL;

java_system_loader属性用于保存应用类加载器实例,在compute_java_system loader()函数中初始化,调用链路如下:

// 源代码位置:
// openjdk8/jdk/src/share/bin/java.c
JavaMain()
InitializeJVM()
CreateJavaVM()
// 源代码位置:
// openjdk8/hotspot/src/share/vm/prims/jni.cpp
JNI_CreateJavaVM()
// 源代码位置:
// openjdk8/hotspot/src/share/vm/runtime/thread.cpp
Threads::create_vm()
// 源代码位置:
// openjdk8/hotspot/src/share/vm/classfile/systemDictionary.cpp
SystemDictionary::compute_java_system_loader()

compute_java_system_ loader()函数调用java.lang.ClassLoader类的getSystemClassLoader()方法,并将方法的返回值保存到_java_system_loader属性。
JavaClass::call_static()函数是HotSpot VM调用Java静态方法的API。

// 源代码位置:
// openjdk8/hotspot/src/share/vm/classfile/systemDictionary.cpp
void SystemDictionary::compute_java_system_loader(TRAPS) {
   
    KlassHandle system_klass(THREAD, WK_KLASS(ClassLoader_klass));
    JavaValue result(T_OBJECT);
    JavaCalls::call_static(&result,
                           KlassHandle(THREAD, WK_KLASS(ClassLoader_klass)),
                           vmSymbols::getSystemClassLoader_name(),
                           vmSymbols::void_classloader_signature(),
                           CHECK);

    _java_system_loader = (oop)result.get_jobject();
}

java.lang.ClassLoader类的getSystemClassLoader()方法如下:

public static ClassLoader getSystemClassLoader() {
   
    initSystemClassLoader();
    if (scl == null) {
   
        return null;
    }
    return scl;
}

private static synchronized void initSystemClassLoader() {
   
    //...
    sun.misc.Launcher l = sun.misc.Launcher.getLauncher();
    if (l != null) {
   
        scl = l.getClassLoader();
    }
    //...
}

在initSystemClassLoader()方法中调用Launcher.getLauncher()方法获取Launcher对象,这个对象保存在jre\lib\rt.jar中sum.misc.Lanucher类的launcher静态属性中。

public class Launcher {
   

    private static Launcher launcher = new Launcher();

    public Launcher() {
   
        // 首先创建扩展类加载器ExtClassLoader 
        Launcher.ExtClassLoader var1;
        try {
   
            var1 = Launcher.ExtClassLoader.getExtClassLoader();
        } catch (IOException var10) {
   
            throw new InternalError("Could not create extension class loader", var10);
        }
        // 以ExtClassloader为父类加载器创建应用类加载器AppClassLoader
        try {
   
            this.loader = Launcher.AppClassLoader.getAppClassLoader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值