zoukankan      html  css  js  c++  java
  • java classloader双亲委派原则

    1.1  class loader

    1.1.1    加载器类型

    1.1.1.1  bootstrap class loader

    引导类加载器/启动类加载器,用来加载java的核心库。主要是 jre/lib目录(来源于环境变量sun.boot.class.path)。其由c++编写,本身属于虚拟机的一部分,无法在java代码中获取它的引用。

    打印其启动的jar:

        String[] files = System.getProperty("sun.boot.class.path").split(";");

        Arrays.asList(files).forEach(System.out::println);   

    结果:

        C:Program FilesJavajdk1.8.0_151jrelibendorsed t_debug.jar (自己添加的debug时用于显示变量的rt.jar)

    C:Program FilesJavajdk1.8.0_151jrelib esources.jar

    C:Program FilesJavajdk1.8.0_151jrelib t.jar

    C:Program FilesJavajdk1.8.0_151jrelibsunrsasign.jar

    C:Program FilesJavajdk1.8.0_151jrelibjsse.jar

    C:Program FilesJavajdk1.8.0_151jrelibjce.jar

    C:Program FilesJavajdk1.8.0_151jrelibcharsets.jar

    C:Program FilesJavajdk1.8.0_151jrelibjfr.jar

    C:Program FilesJavajdk1.8.0_151jreclasses

     

    1.1.1.2  extensions class loader

    扩展类加载器,用来加载java的扩展库

    打印其启动的jar

        String[] extFiles = System.getProperty("java.ext.dirs").split(";");

        Arrays.asList(extFiles).forEach(System.out::println); 

    结果:

    C:Program FilesJavajdk1.8.0_151jrelibext

    C:WindowsSunJavalibext

    1.1.1.3  system class loader/application class loader

    系统类加载器

    打印其启动的jar

        String[] appFiles = System.getProperty("java.class.path").split(";");

        Arrays.asList(appFiles).forEach(System.out::println); 

    结果:

    E:work_spaceStudy arget est-classes

    E:work_spaceStudy argetclasses

    D:mvn_repositroyorgslf4jslf4j-api1.7.22slf4j-api-1.7.22.jar

    D:mvn_repositroychqoslogbacklogback-core1.1.8logback-core-1.1.8.jar

    D:mvn_repositroychqoslogbacklogback-classic1.1.8logback-classic-1.1.8.jar

    1.1.1.4  自定义加载器

    1.1.2    类加载器之间的关系

      除了引导类加载器,所有的类加载器都有一个父类加载器。

      默认情况下,开发人员自己编写的类加载器父类加载器是系统类加载器(除非显示指定了父类加载器)。可以通过getParent()获得(除了父类为引导类加载器)。示意图如下:

     

      

     

       

    1.1.3    双亲委托

    java虚拟机是如何判定两个class是相同的:不仅要看类的全名是否相同,还要看加载器是否相同。

    比如Hello.class是编译后的字节码,如果不自定义加载器,那么只会加载一次这个class,但是如果自定义了两个同级classloader,那么则可以加载两个class。

    双亲委托主要概念见下图,设计思想主要是避免同一个类被不同的加载器加载,导致额外问题。

    加载类之前先看看父类有没有,没有的话看看父类能不能加载,父类有的直接复用,父类能加载的自己绝不加载。(自定义类加载器除外,某些时刻属于定制加功能)

    1.1.3.1  示意图

       

      

      

    1.1.4    参考资源

    https://blog.csdn.net/briblue/article/details/54973413

    https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html

    https://www.jianshu.com/p/6e5c2b463b2a

    备注:图都是摘录的,理论上来源于上面三个链接。

  • 相关阅读:
    【字符串哈希】The 16th UESTC Programming Contest Preliminary F
    【推导】The 16th UESTC Programming Contest Preliminary L
    【推导】zoj3846 GCD Reduce
    【spfa】【动态规划】zoj3847 Collect Chars
    【搜索】【组合数学】zoj3841 Card
    【贪心】【字典树】Gym
    【贪心】【后缀自动机】Gym
    【拉格朗日插值法】【找规律】【高精度】Gym
    【二分】【动态规划】Gym
    【软件开发综合实验】文本压缩软件
  • 原文地址:https://www.cnblogs.com/gc65/p/10170853.html
Copyright © 2011-2022 走看看