【JVM】 类加载器 ClassLoader

news2024/9/29 3:30:11

一、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.jar

Process 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 应用可依赖不同版本的类的关键)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕业设计ssm宁夏源沣医药线上销售平台thd3v(附源码、数据库)

java计算机毕业设计ssm宁夏源沣医药线上销售平台thd3v(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&a…

戳进来,带你走近飞凌嵌入式旗舰级AIoT芯RK3588开发板

飞凌嵌入式OK3588-C开发板现已正式发售!真8K、强大算力、出色的多媒体性能、丰富的用户资料......多重优势为您带来更优质的体验! OK3588-C开发板基于Rockchip旗舰级AIoT处理器RK3588设计开发,先进的8nm制程工艺、Big.Little大小核架构以及L3…

[附源码]计算机毕业设计springboot学分制环境下本科生学业预警帮扶系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于PHP+MySQL班级信息发布和管理系统的设计与实现

一直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对学生信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对学生信息进行管理,才能够更加积极的培养国家的栋梁之才。…

VIAVI唯亚威SmartPocket V2 OLS-35V2/-36V2 光学光功率计

OLS-3xV2 是一系列小巧、坚固耐用的光学光源 (OLS),用于快速、轻松、方便地进行现场插入损耗测量和连续性检查。SmartPocket V2 OLS 是与 OLP-3xV2 光功率计相辅相成的理想工具,可在单模 (SM) 和多模 (MM) 光纤网络中实现插入损耗和连续性测试。坚固小巧…

[附源码]计算机毕业设计springboot兴达五金日杂批发商店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Linux 磁盘空间异常爆满,该怎么查?

在服务器运维过程中,我们时常会遇到这样的情况,收到服务器磁盘空间告警: 登录服务器,通过df -Hl查看 和告警信息一致,接着我们就是要找到导致磁盘空间满的目录或文件。 如何找到占用空间大的目录或文件? …

【Python基础系列】Part1. 基本数据类型与变量

一、变量与简单数据类型 1.Hello World hello_world.py中输入: print("Hello World")运行,然后会看到一下输出: Hello World具体流程:运行hello_world.py时,末尾的.py表明这是一个python程序&#xff0c…

如何选择正确的哈希算法?

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 你想要的,这里都有! DevWeekly收集整理每周优质开发者内容,包括开源项目、资源工具、技术文章等方面。 每周五定期发布,同步更新到知乎:Jac…

RabbitMQ--延迟队列--使用/原理

原文网址:RabbitMQ--延迟队列--使用/原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍RabbitMQ的延迟队列的用法。 本内容也是Java后端面试中常见的问题。 概述 延迟队列用来存放延迟消息。延迟消息:指当消息被发送以后,不想让消费者立刻拿到…

业务:财会业务知识之借贷记账法

一、为什么要学习借贷记账法 如果你是一位金融行业的IT从业者,那你经常会接触到借贷的概念,只要复式记账的概念,其实也够用了,在记录交易流水时,跟业务问清楚哪些交易记录哪个借贷符号,记录哪些科目既可以…

【Java】从0开始个人网站建立(三)博客主页文章分页查询,预览显示

(一)工程建立到登录与认证-Spring boot、Shiro、Mybatis-Plus、MySql (二)博客显示与登录后按钮按照Shiro授权显示加载html (三)博客主页文章分页查询,预览显示 五、文章分页查询、预览显示 5…

Discrete Optimization课程笔记(3)—局部搜索

目录​​​​​​​ 1.局部搜索(Local Search) Case1: The Queens problem(Max/Min-Conflict) 2.邻域交换(swap neighborhood) Case2: Car Sequencing problem(number of violations) Case3: The Magic Square Problem(degree of violations) ​​​​​​​3.旅行商问题…

【Linux】进程的概念|查看进程的方法|子进程

文章目录基本概念“先描述”进程(PCB)task_ struct内容分类“再组织”进程最终结论:如何查看进程方法一:方法二:通过系统调用获取进程标识符通过系统调用创建进程子进程(fork)实验一&#xff1a…

Java基于PHP+MySQL客户信息管理系统的设计与实现

随着我国经济的发展,越来越多的企业出现,但是相对企业来说客户才是企业的根本,如何能够更好的当下的客户信息进行管理,是很多企业一直以来所关心的问题,如果对客户的信息不够重视最终将会使企业在激烈的竞争中失去活力,为此我们开发了本客户信息管理系统。 本客户信息管理系统采…

IB究竟在考什么?IB真的有传闻中的那么难吗?

提起学习“国际课程之王”IB的感受,学生们估计都能开一个“吐槽大会”了,IB很难,不少人学IB,GET到的第一个技能,就是“熬夜”。▲IB学生做的搞笑图:凌晨三点,唯一一扇亮着灯的窗户一定是属于IB学…

安装与调试Dragonfly实现自动化测试项目

通过ASP.NET Core Selenium 实现 Web 自动化平台 1、获取项目 从Gitee上拉取代码到本地。地址: 点击这里 有多种方式拉取,我使用的zip下载方式。 2、解压运行 这里我是在F盘新建了一个文件夹,只放这一个项目。 点击解压文件,找到“.sln”…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统9p5w4

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了,确实,从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做,创…

逻辑回归-为什么模型会更加侧重于学习那些数值比较大的列

np.random.seed(24)features,labels arrayGenReg(w[1,-1,1])将第一个特征取值调大100倍 features[:,:1] features[:,:1] * 100 features --- array([[ 132.92121726, -0.77003345, 1. ],[ -31.62803596, -0.99081039, 1. ],[-107.08162556, -1.43…