JVM-02 类加载器深入解析 梦里梦外; 2022-03-16 03:20 192阅读 0赞 ### 文章目录 ### * 1.类加载过程 * * 1.1 类加载 * 1.2 类加载器种类 * * 1.2.1 测试代码 * 1.3 类加载机制 * * 1.3.1 全盘负责委托机制 * 1.3.2 ==双亲委派机制== * * 1.3.2.1 双亲委派模式优势 * 1.4 类加载过程 # 1.类加载过程 # ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70] > Java运行时编译源码(.java)成字节码,由jre运行。jre由java虚拟机(jvm)实现。Jvm分析字节码,后解释并执行 ## 1.1 类加载 ## > 类加载器将class文件加载到虚拟机的内存 ![在这里插入图片描述][20190226112237286.png] * 加载:在硬盘上查找并通过IO读入字节码文件 * 连接:执行校验、准备、解析(可选)步骤 * 校验:校验字节码文件的正确性 * 准备:给类的静态变量分配内存,并赋予默认值(后面一步才会赋值) * 解析:类装载器装入类所引用的其他所有类 * 初始化:对类的静态变量初始化为指定的值,执行静态代码块 ## 1.2 类加载器种类 ## * 启动类加载器:负责加载JRE的核心类库,如jre目标下的rt.jar,charsets.jar等 * 扩展类加载器:负责加载JRE扩展目录ext中JAR类包 * 系统类加载器:负责加载ClassPath路径下的类包 * 用户自定义加载器:负责加载用户自定义路径下的类包 ### 1.2.1 测试代码 ### /** * 描述:类加载器 * @author: myx * @date: 2019/1/20 * Copyright © 2018-hotpot. All rights reserved. */ public class TestJDKClassLoader { public static void main(String[] args){ System.out.println(String.class.getClassLoader()); System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName()); System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName()); System.out.println(ClassLoader.getSystemClassLoader().getClass().getName()); } } 运行效果: null #启动类加载器获取不到(本地方法) sun.misc.Launcher$ExtClassLoader #拓展加载器 sun.misc.Launcher$AppClassLoader #系统加载器 sun.misc.Launcher$AppClassLoader #系统加载器 ## 1.3 类加载机制 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70 1] ### 1.3.1 全盘负责委托机制 ### > 当一个ClassLoader加载一个类时,除非显示的使用另一个ClassLoader,该类所依赖和引用的类也由这个ClassLoader载入 ### 1.3.2 双亲委派机制 ### > 指先委托父类加载器寻找目标类,在找不到的情况下在自己的路径中查找并载入目标类 #### 1.3.2.1 双亲委派模式优势 #### * **沙箱安全机制**:自己写的String.class类不会被加载,这样便可以防止核心API库被随意篡改 package java.lang; /** * 描述:沙箱安全机制 * @author: myx * @date: 2019/1/20 * 注意:本内容仅限于学习使用 * Copyright © 2019-myx. All rights reserved. */ public class String { public static void main(String[] args) { System.out.println("myx"); } } ![在这里插入图片描述][20190226112254361.png] 默认加载的是jdk里面的String类。 * **避免类的重复加载**:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次 ## 1.4 类加载过程 ## > JVM对class文件是按需加载(运行期间动态加载),非一次性加载。 /** * 描述:按需加载测试 * @author: myx * @date: 2019/1/20 * Copyright © 2018-hotpot. All rights reserved. */ public class TestDynamicLoad { static { System.out.println("*************static code************"); } public static void main(String[] args){ new A(); System.out.println("*************load test************"); new B(); } } class A{ public A(){ System.out.println("*************initial A************"); } } class B{ public B(){ System.out.println("*************initial B************"); } } 添加运行参数:-verbose:class ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70 2] 运行结果: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70 3] ***更多JVM相关知识请参考目录***:[JVM学习目录][JVM] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70]: /images/20220316/e048ad36810a4fd0950267a3972e7a31.png [20190226112237286.png]: /images/20220316/58abddfeb3204d08921c93d1c29f5cc3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70 1]: /images/20220316/085925f953cd41d9b37fa59b30886b6f.png [20190226112254361.png]: /images/20220316/24beb95522884e62a9a5768a89e05f48.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70 2]: /images/20220316/04298b62e7084179b612c29f3373ee5f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxNDYzOTk5_size_16_color_FFFFFF_t_70 3]: /images/20220316/247ba1b75d6b47a8b4ded87eb690af64.png [JVM]: https://blog.csdn.net/qq_31463999/article/details/87966505
还没有评论,来说两句吧...