美文网首页Java相关
JVM - 类的加载机制

JVM - 类的加载机制

作者: 万福来 | 来源:发表于2020-04-02 16:18 被阅读0次

    JVM - 类的加载机制

    什么是类的加载

    类的加载指将类的.class文件二进制数据读入到内存中,将其放在运行时的方法区内,然后在堆内存创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。Class对象封装了类在方法区内的数据结构,并提供了各种访问接口。

    类的加载过程

    加载 --> 验证 --> 准备 --> 解析 --> 初始化 --> 使用 --> 卸载

    1. 加载:通过类加载器加载class文件,并在堆内存创建Class对象;
    2. 验证:验证文件格式、元数据、字节码和符号引用等是否符合JAVA规范,否则报错;
    3. 准备:初始化类的静态变量和默认值;
    4. 解析:将常量池内的符号引用替换为直接引用;
    5. 初始化:将类中静态变量赋予初始值;
    6. 使用:new出对象并使用;
    7. 卸载:执行垃圾回收。

    类加载器

    • 启动类加载器:主要负责加载jre/lib目录下的类库;
    • 扩展类加载器:主要负责加载jre/lib/ext目录或者java.ext.dirs系统变量指定的目录下的类库;
    • 应用程序类加载器:主要负责加载classpath指定的目录下类库

    类加载机制

    • 双亲委派:先让父类加载尝试加载类,父类加载器无法加载时才有当前类加载器进行加载;
    • 全面负责:一个类加载器加载某个class时,该class依赖的其他类也有该类加载器负责加载;
    • 缓存机制:所有加载过的class类都会被缓存,类加载器会先从缓存区查询,查询不到时才去加载。

    类加载方式

    • 命令行启动应用时候由JVM初始化加载
    • 通过Class.forName()方法动态加载
    • 通过ClassLoader.loadClass()方法动态加载

    Class.forName()和ClassLoader.loadClass()区别

    • Class.forName():将类的.class文件加载到jvm中,还会对类进行解释,执行类中的static块;
    • ClassLoader.loadClass():将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
    • Class.forName(name,initialize,loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。

    相关文章

      网友评论

        本文标题:JVM - 类的加载机制

        本文链接:https://www.haomeiwen.com/subject/luixphtx.html