JAVA类加载机制详解

article/2025/9/19 9:23:20

上一篇文章我们简单说了一下类的创建过程,但是如果JVM需要加载类,会经过哪些具体的过程呢?下面我们就来谈一谈。

要了解加载类的过程,我们就必须要了解类加载器。

在很多初学者刚听到类加载器的时候觉得很高大上,其实类加载器无非就是和我们平时说的Class对象而已。

在java里面我们经常用到的类加载器可能就是以下几种:

  • 引导(启动)类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等 bootstrtload------>jre/lib目录
  • 扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JA类包 extClassLoad------->jre/lib/ext目录下
  • 应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类 appClassLoad------>classPath目录下
  • 自定义加载器:负责加载用户自定义路径下的类包

类加载原理:主要使用双亲委派机制

双亲委派机制:一个类进来先由应用类加载器------->扩展类加载器------->启动类加载器 然后启动类建加载器尝试加载 因为启动类加载器去加载jre包下面的lib目录 而我们写的类在classpath下面 启动类加载器加载不到就会像扩展类加载器(默认加载ext包下面的)去下发------------>应用类加载器 (从claaPath下面查找)

总结就是:双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载

双亲委派详情具体执行过程: 调用findClassLoad 判断有没有被加载 如果没有被加载 判断parent是否为空 如果为空调用bootstrap引导类加载器,extClassLoad里面是没有findClass()方法的 然后去调用URLCalssLoad里面的findClass()方法 然后去找target下面对应的类文件加载到(调用define方法()这个方法比较复杂,没有仔细研究过)jvm内存里面去 此时肯定加载不到因为类再target下面不在extclasss下面 返回为null 此时又会返回appclassload下面 找到对应appclassload的findclass()方法加载也会调用urlclassload的逻辑同时也会调用define()(调用一系列本地方法执行加载加载的过程)方法 此时就会加载到对应的.class文件

双亲委派源码: 重要的方法ClassLoad 类里面的loadClass 里面实现findClass()方法 真正加载类的逻辑

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
//  loadClass()实现双亲委派机制
{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);//如果第一次这个类已经加载了   当再次用到这个类的时候直接返回即可  不需要再次加载if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {//调用顶级启动类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();//真正加载类的逻辑c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}
}

为什么要设计双亲委派机制?

  1. 沙箱安全机制:自己写的java.lang.String.class类不会被加载(包名和类名和jdk自带的一样 运行不成功),这样便可以防止核心API库被随意篡改(自己在自定义类加载器里面要加载java.lang....类似于和核心包里面系统的包名称 jvm直接报一个安全异常) jvm加载到和自己核心类库里面相同的类必须用自己类库里面的类。

  2. 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次(父类就直接返回了),保证被加载类的唯一性(相同包名类名只加载一份)。

类加载机制还有一个全盘负责委托机制,所谓的"全盘负责"是指当一个ClassLoder装载一个类时,假如这个类也用到其他的类了 这个类也会由这个ClassLoader加载,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入。

相信很多人面试的时候一般都会问到关于双亲委派机制的问题。同时可能面试官还会问一个怎么打破这个机制。如果问到这个问题基本上就是问双亲委派的源码了,在上面的代码里面也提到了,双亲委派机制核心就是两个核心:ClassLoad 类里面的loadClass 里面实现findClass()方法 真正加载类的逻辑,基本上就是重写重写loadClass()方法即可。

为什么要打破双亲委派机制?

(双亲委派加载在以下情况下不能解决问题(tomcat为例) 1,假如web容器里部署两套应用程序,不同的应用程序可能依赖第三方库的版本不一样,不能要求同一个类库在同一个服务器只有一份,因此要保证每个应用程序的类库都是独立的,保证相互隔离 一个spring版本4 一个是spring5 如果4先加载了 如果5再使用同样的库 那么拿到的就是4加载的那个 就会出现问题,部署在同一个web容器中相同的类库相同的版本可以共享, 2, web容器也有自己依赖的类库,不能与应用程序的类库混淆。3,基于安全考虑,应该让容器的类库和程序的类库隔离开来。 这些问题是双亲委派机制解决不了的 双亲委派机制要求同一个类同一个包名只能加载一份)

tomcat就是典型的打破了双亲委派:

tomcat 为了实现隔离性 没有遵循jvm双亲委派机制 tomcat自定义了很多类加载器 其中的一个WebAppClassLoder 每一个应用程序webappClassLoader都是相互隔离的加载自己的目录下(jir)的class文件,不会传递给父类加载器,打破了双亲委派机制。tomcat里面每一个war包都会对应生成一个appClassLoad。

 


http://chatgpt.dhexx.cn/article/hHX7kTUg.shtml

相关文章

Android 类加载机制

1.类加载机制 .java文件不是可执行的文件,需要先编译成.class文件才可以被虚拟机执行。而类加载就是指通过类加载器把.class文件加载到虚拟机的内存空间,具体来说是方法区。类通常是按需加载,即第一次使用该类时才加载。 Java与Android都是把类加载到虚拟机内存中,然后由…

面试题:请介绍 JVM 类加载机制

JVM 类加载机制 Java 代码执行流程类的生命周期加载验证准备解析初始化clinit 和 init 方法 类加载的时机被动引用 类加载器双亲委派机制 我们在前面分析JVM架构解析的时候&#xff0c;简单介绍了 Java 类加载机制&#xff0c;本文带大家深入分析一下。 Java 代码执行流程 根据…

Tomcat 的类加载机制

在前面 Java虚拟机&#xff1a;对象创建过程与类加载机制、双亲委派模型 文章中&#xff0c;我们介绍了 JVM 的类加载机制以及双亲委派模型&#xff0c;双亲委派模型的类加载过程主要分为以下几个步骤&#xff1a; &#xff08;1&#xff09;初始化 ClassLoader 时需要指定自己…

java类加载机制

最近开通了一个订阅号 gexiaolong 在其中记录一些关于java总是记了又忘&#xff0c;忘了又记的一些知识点&#xff0c;所以还是写一篇日志记录一下吧 老规矩&#xff0c;抄作业&#xff0c;关于java的类加载机制的问题也是看了忘&#xff0c;忘了又在看 在此梳理记录一下 说…

类加载机制详解

一、类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 虚拟机设计团队把类加载阶段中的“通过一个类的全限定…

类的加载机制

文章目录 前言类加载的生命周期&#xff1a;加载&#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;PreParation&#xff09;、解析(Resolution)、初始化、使用、销毁&#xff0c;其中验证&#xff0c;准备&#xff0c;解析又叫做连…

类加载机制

1、JVM 和 类 &#xff08;1&#xff09;运行java命令&#xff1a; java 带有main方法的类名 ■ 命令的作用&#xff1a;启动jvm&#xff0c;并加载字节码&#xff0c;执行程序 当调用java命令来运行某个java程序时&#xff0c;该命令将会启动一个jvm进程&#xff08;同一个…

双亲委派模型的破坏

一、类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这就是虚拟机的类加载机制。 虚拟机设计团队把类加载阶段中的“通过一个类的全限定…

类加载机制(整个过程详解)

一:背景 类加载机制是在我们的真个java的运行阶段中的其中一个阶段。 二:什么是快乐星球(类加载机制) 我们编写的 Java 文件都是以.java 为后缀的文件&#xff0c;编译器会将我们编写的.java 的文件编译成.class 文件&#xff0c;简单来说类加载机制就是jvm从文件系统将一系…

TCP/IP四层模型---应用层

相对于OSI七层模型,TCP/IP四层模型更为简化,总结为应用层,传输层,网络层,数据链路层四层 简单来说,四层协议分别为: 协议 应用层DNS,URI,HTML,HTTP,SSL,SMTP,POP,IMAPTELNET,SSH,FTP,SNMP应用程序相关传输层TCP,UDP,UDP-Lite,SCTP,DCCP操作系统内核负责网络层ARP,IP,ICMP数据链…

OSI七层网络模型与TCP/IP四层网络模型

OSI模型&#xff0c;即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model)&#xff0c;是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架&#xff0c;简称OSI。 OSI网络模型按照…

TCP/IP五层(四层)模型

TCP/IP五层&#xff08;四层&#xff09;模型中包含的协议有很多&#xff0c;其中典型代表是TCP协议和IP协议。 应用层&#xff1a;应用程序直接打交道的协议。在实际开发中涉及最多的部分&#xff0c;甚至需要自己设计应用层协议。 传输层&#xff1a;负责端到端之间的传输。&…

【计算机网络】TCP/IP四层模型和OSI七层模型

文章目录 一、TCP/IP四层模型和OSI七层模型关系二、TCP/IP四层模型三、OSI七层模型四、GET和POST的区别五、从输入网址到页面展示的过程六、详细过程 一、TCP/IP四层模型和OSI七层模型关系 1、OSI引进了服务、接口、协议、分层的概念&#xff0c;TCP/IP借鉴了OSI的这些概念建立…

TCP/IP四层模型与OSI七层模型

1&#xff09;网络协议 【网络协议】是【网络上所有设备】&#xff08;网络服务器、计算机及交换机、路由器、防火墙等&#xff09;之间【通信规则】的【集合】&#xff0c;它规定了进行【网络中的对等实体数据交换】而建立的规则。由于大多数网络采用【分层的体系结构】&…

OSI七层模型和TCPIP四层网络模型

OSI七层模型和TCP/IP四层网络模型 写在文前&#xff0c;本篇文章是在学习过程抄录的笔记&#xff0c;需要更详细的内容可以在微信搜索javaguide公众号获取。1、OSI划分 七层划分&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层五层划分&#xff1a;…

读懂TCP IP四层模型与OSI七层模型

目录 一、OSI七层模型 二、TCP/IP四层模型 三、OSI模型的七层解读 3.1 OSI七层模型小结 3.2 TCP/IP模型与OSI模型的对应关系 四、常见的网络相关协议 五、TCP和UDP协议 5.1 TCP三次握手 5.2 TCP四次挥手 5.3 UDP协议 5.4 TCP和UDP的区别 六、TCP/IP四层模型与OSI七…

Linux网络_从系统到网络(网络协议栈分层与功能,认识协议,OSI七层模型与TCPIP四层模型,网络通信流程(局域网,跨网络),MAC地址,IP地址)

文章目录 1.网络在体系结构的位置与网络协议栈的层状结构2.协议栈各层的功能3.协议4.OSI七层模型与TcpIp四层模型5.网络通信的流程局域网通信流程(以太网)MAC地址跨网络通信IP地址 1.网络在体系结构的位置与网络协议栈的层状结构 2.协议栈各层的功能 协议栈分层设计达到了解耦目…

TCP/IP五层(或四层)模型

图解TCP/IP协议 基本概念 1、TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议&#xff0c;可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口&#xff0c;使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三…

matlab怎么画两个自变量的图_tcpip四层模型怎么画?画模型图的好用软件推荐

tcpip四层模型就是一个将osi参考模型的会话层和表示层合并到应用层&#xff0c;数据链路层和物理层合并为链路层后的结果。tcpip四层模型包含应用层、运输层、网络层和链路层。tcpip四层模型的协议功能包括数据的发送、与硬件的交互、消息路由规则、格式定义、错误验证。 tcpip…