【JVM】 类加载器 ClassLoader
创始人
2024-03-13 16:27:55
0

一、JVM 类加载器

JVM 具有 4 种类加载器:

  1. 引导类加载器 : 负责加载支持 JVM 运行的位于 JRE 的 lib 目录下的核心类库,比如 rt.jar 、charsets.jar 等等
  2. 扩展类加载器:负责加载支撑 JVM 运行的位于 JRE 的 lib 目录下的 ext 扩展目录中的 JAR 类包
  3. 应用程序类加载器:负责加载 ClassPath 路径下的类包,就是我们自己写的那些类
  4. 自定义类加载器:负责加载用户自定义路径下的类包

代码示例:

import sun.misc.Launcher;
import java.net.URL;/*** @Author: WanqingLiu* @Date: 2022/12/02/15:11*/
public class DemoClassLoader {public static void main(String[] args) {System.out.println(String.class.getClassLoader());System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader());System.out.println(TestJDKClassLoader.class.getClassLoader());System.out.println();ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();ClassLoader extClassLoader = appClassLoader.getParent();ClassLoader bootstrapClassLoader = extClassLoader.getParent();System.out.println("引导类加载器为:" + bootstrapClassLoader);System.out.println("扩展类加载为:" + extClassLoader);System.out.println("应用类加载器为:" + appClassLoader);System.out.println();System.out.println("***引导类加载器加载的文件有:***");URL[] urls = Launcher.getBootstrapClassPath().getURLs();for(URL url : urls){System.out.println(url);}System.out.println();System.out.println("***扩展类加载器加载的文件有:***");String extClassLoaderFiles = System.getProperty("java.ext.dirs");String[] extClassLoaderFilesArr = extClassLoaderFiles.split(";");for (String str : extClassLoaderFilesArr){System.out.println(str);}System.out.println();System.out.println("***应用类加载器加载的文件有:***");String  appClassLoaderFiles = System.getProperty("java.class.path");String[] appClassLoaderFilesArr = appClassLoaderFiles.split(";");for (String str : appClassLoaderFilesArr){System.out.println(str);}}
}

结果输出:

null
sun.misc.Launcher$ExtClassLoader@7ea987ac
sun.misc.Launcher$AppClassLoader@18b4aac2引导类加载器为:null
扩展类加载为:sun.misc.Launcher$ExtClassLoader@7ea987ac
应用类加载器为:sun.misc.Launcher$AppClassLoader@18b4aac2***引导类加载器加载的文件有:***
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/rt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/sunrsasign.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_181/jre/classes***扩展类加载器加载的文件有:***
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext
C:\Windows\Sun\Java\lib\ext***应用类加载器加载的文件有:***
C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar
C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar
C:\Users\15141\Desktop\headCount\out\production\headCount
D:\IntelliJ IDEA 2022.2.3\lib\idea_rt.jarProcess finished with exit code 0



二、类加载双亲委派机制

先找父亲加载器加载,不行再由儿子加载器自己加载,其流程如下:

在这里插入图片描述

好处:

  1. 沙箱安全机制 —— 比如自己写的 java.lang.String.class 类不会被加载,从而防止核心 API 类库被篡改
  2. 避免类重复加载:只由加载一次就行了,发现被加载过,直接返回



三、Tomcat 底层类加载

1. Tomcat类加载用的是双委派机制嘛

Tomcat 打破了双亲委派机制,原因如下:

不同应用程序依赖的 war 包使用了相同名称的类,但是这些类版本不同。如果使用双亲委派机制,只能加载一个,不能把不同版本的都加载进去。

再详细解释:

我们都用过 Tomcat 服务器,一个 Tomcat 服务器上可能同时部署多个应用程序,这多个应用程序可能使用的第三方类库相同,但是版本不同,也就是说存在类名相同,但是内容不同的类。这时,假如我们使用了双亲委派机制,那就只能加载一个进去。很显然,这是不合理的,因此 Tomcat 使用自定义类加载器,而不使用双亲委派机制。

Tomcat 通过自定义类加载器的方式解决上述问题,其示意图如下:

在这里插入图片描述

2. Tomcat自定义类加载器有那些:
  1. CommonLoader:Tomcat 最基本的类加载器,加载路径中的 class 可被 Tomcat 容器本身以及各个 Webapp 访问
  2. CatalinaLoader: Tomcat 容器私有的类加载器,加载路径中的 class 对于 Webapp 不可见
  3. ShareLoader:各个 Webapp 共享的类加载器,加载路径中的 class 对于所有的 Webapp 可见,对 Tomcat 容器不可见
  4. WebappClassLoader:各个 Webapp 私有的类加载器,加载路径中的 class 只对当前的 Webapp 可见,对其他的 Webapp 不可见 (实现每个 Web 应用可依赖不同版本的类的关键)

在这里插入图片描述

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...