• 深入理解JVM虚拟机_1 JVM类加载器设计原理


     深入理解JVM虚拟机_1 JVM类加载器设计原理

    作者:田超凡

    原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂

    什么是类加载器

    将Java文件编译后生成的class文件读取到内存中

    类加载器加载的过程

    类加载器加载我们的class文件,并且经历过验证、准备、解析,在初始化我们该类。

    Class文件读取来源

    1.本地磁盘文件 java源代码编译的class文件

    2.通过网络下载的class文件

    3.War、Jar包解压的class文件

    4.从专门的数据库中读取的class文件

    5.使用java cglib、jdk动态代理(JavaCompile)生成的代理类class文件

    Jvm虚拟机中,通过类加载器(用户可以自定义类加载器)来加载class文件到内存中

    类加载器的分类

    1. 启动(Bootstrap)类加载器加载JVM自身工作需要的类,它由JVM自己实现。它会加载$JAVA_HOME/jre/lib下的文件。

    底层是基于C语言实现,是最底层的类加载器实现。

    1. 扩展(Extension)类加载器它是JVM的一部分,由sun.misc.LauncherExtClassLoader实现,他会加载ExtClassLoader的实现,也会加载%JAVA_HOME/jre/lib/ext目录中的文件(或由System.getProperty(“java.ext.dirs”)所指定的文件),底层是Java语言实现。

    1. 应用程序(Application)类加载器:应用类加载器,我们工作中接触最多的也是这个类加载器,它由sun.misc.Launcher$AppClassLoader实现。他加载我们工程编译目录classpath下的class及jar包,底层是Java语言实现

    1. 自定义类加载器: 也就是用户自己定义的类加载器,继承ClassLoader并重写方法

    Launcher 源码解读
    
    Launcher.ExtClassLoader var1;
    
      try {
    // 获取到我们扩展类加载器
    
        var1 = Launcher.ExtClassLoader.getExtClassLoader();
    
    } catch (IOException var10) {
    
        throw new InternalError("Could not create extension class loader", var10);
    
    }
    
      
    
      try {
    //获取到我们应用类加载器
    
        this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
    
    } catch (IOException var9) {
    
        throw new InternalError("Could not create application class loader", var9);
    
    }
    
    // 当前程序启动的线程 默认的 ClassLoader 应用类加载器
    
      Thread.currentThread().setContextClassLoader(this.loader);
    
      String var2 = System.getProperty("java.security.manager");
    
      if (var2 != null) {
    
        SecurityManager var3 = null;
    
        if (!"".equals(var2) && !"default".equals(var2)) {
    
            try {
    
                var3 = (SecurityManager)this.loader.loadClass(var2).newInstance();
    
            } catch (IllegalAccessException var5) {
    
            } catch (InstantiationException var6) {
    
            } catch (ClassNotFoundException var7) {
    
            } catch (ClassCastException var8) {
    
            }
    
        } else {
    
            var3 = new SecurityManager();
    
        }
    
      
    
        if (var3 == null) {
    
            throw new InternalError("Could not create SecurityManager: " + var2);
    
        }
    
      
    
        System.setSecurityManager(var3);
     

    那些操作会初始化类加载器

    类的主动使用:

    1. 调用类的静态方法
    2. invokeStatic   调用静态方法
    3. Main
    4. New
    5. Class.forName
    6. 子类初始化一定会初始化父类

    小结:

    初始化一个类的时候,那么一定会触发类加载器。

    但是类加载器加载了一个类,该类却不一定被初始化。

  • 相关阅读:
    FileInputStream和FileOutputStream
    2023-简单点-树莓派安装ncnn框架
    sql注入学习-知识点大合集
    二叉搜索树 - C++ 实现
    最新!两步 永久禁止谷歌浏览器 Google Chrome 自动更新
    Chrome Extensions v3 迁移清单
    LeetCode50天刷题计划第二季(Day 29 — 寻找峰值(11.10-12.10)
    NEFU数字图像处理(2)图像增强
    应用在儿童平板防蓝光中的LED防蓝光灯珠
    《数据结构》复试问答题总结
  • 原文地址:https://blog.csdn.net/qq_30056341/article/details/126392223