【JVM】详解类加载机制

article/2025/9/19 9:25:29

JVM的类加载机制

    • 一、类的生命周期
    • 二、类加载的过程
      • 1.加载
      • 2.连接
      • 3.初始化
    • 三、类加载器的介绍
      • 3.1 启动类加载器(根类加载器/引导类加载器)(Bootstrap ClassLoader)
      • 3.2 扩展类加载器
      • 3.3 系统类加载器
    • 四、双亲委派模型
      • 4.1 双亲委派模型的优点
      • 4.2 双亲委派模型的破坏

一、类的生命周期

对于一个类来说,它的生命周期是这样的:
在这里插入图片描述

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载连接初始化三个步骤对该类进行初始化。所以将这三个步骤称为类加载
其中连接又分为三步:验证、准备、解析

下面我们来仔细了解一下类加载的过程:

二、类加载的过程

1.加载

  1. 加载是将类的class文件读入到内存,并将这些静态数据转换成方法区中的运行时数据结构,并在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。

2.连接

当类被加载之后,系统会为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中(意思就是将java类的二进制代码合并到JVM的运行状态中)。

类连接又可分为以下三个阶段:

  1. 验证:确保加载的类信息是否符合JVM规范,有没有安全方面的问题。主要验证是否符合Class文件格式规范,并且是否能被当前的虚拟机加载处理。
  2. 准备:正式为类中定义的变量(静态变量)分配内存并设置类变量默认初始值阶段,这些内存都将再方法区中进行分配。
  3. 解析:虚拟机常量池的符号引用替换成直接引用的过程,也就是初始化变量的过程。 符号引用:是一组符号来描述所引用的目标,符号可以是任何的字面形式的字面量,只要不会出现冲突能够定位到就行。布局和内存无关。 直接引用:是指向目标的指针,偏移量或者能够直接定位的句柄,该引用是和内存中的布局有关的,并且一定加载进来的。

3.初始化

初始化是为类的静态变量赋予正确的初始值,准备阶段和初始化阶段看似有点矛盾,其实不然。 比如这样的一句代码:private static int a=10;,在准备阶段给a赋值是int类型的默认初始值0,到初始化这一阶段才会把a真正的值10赋给它。

三、类加载器的介绍

类加载器就是在类加载阶段实现“通过一个类的全限定名(包名+类名)来获取类的二进制字节流”这个动作的。

在这里插入图片描述

3.1 启动类加载器(根类加载器/引导类加载器)(Bootstrap ClassLoader)

它用来加载Java的核心类,是用原生代码来实现的,并不继承自java.lang.ClassLoader.由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。负责加载扩展类加载器和系统类加载器,并为他们的指定父类加载器。

3.2 扩展类加载器

由Java语言编写的,派生于ClassLoader类,上层类加载器为启动类加载器。它负责加载JRE/lib/ext目录下的类。

3.3 系统类加载器

Java语言编写,派生于ClassLoader类,上层类加载器为扩展类加载器。负责加载我们自己定义的类。

四、双亲委派模型

工作原理:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果费雷加载器还存在其父类加载器,则进一步向上委托,一次递归,请求最终将到达顶层的启动类加载器。如果父类加载器可以完成类加载任务,就成功返回,如果父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
也就是每个儿子都很懒,每次有活交给父亲去干,直到父亲说这件事我也干不了的时候,儿子才自己想办法。

在这里插入图片描述

4.1 双亲委派模型的优点

  • 避免类的重复加载:比如A类和B类都有一个父类C类,那么A启动时就会将C类加载起来,那么B类进行加载的时候就不需要重复加载C类了。
  • 安全性:使用双亲委派模型可以保证Java核心API不被篡改。假设通过网络传递一个名为java.lang.Integer的类,通过双亲委派莫辛纳甘传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已经被加载了,并不会重新加载网络传递过来的java.lang.Integer类,而是直接返回已加载过的Integer.class,这样便可以防止核心API库被随便篡改。

4.2 双亲委派模型的破坏

双亲委派模型的弊端:不能向下委派,不能不委派。
那么我们要打破双亲委派模型:也就是能向下委派和不委派。

向下委派:SPI机制

SPI机制
SPI机制是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里定义的类。这一机制为很多框架扩展提供了可能,比如在JDBC中就使用到了SPI机制。

SPI机制如何打破双亲委派模型:
在某些情况下父类加载器需要委托子类加载器去加载class文件。受加载范围的限制,父类加载器无法加载到需要的文件。
以Drive接口为例,DriverManger通过启动类加载器加载进来,而com.mysql.jdbc.Driver是通过系统类加载器加载进来的。由于双亲委派模型父类加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类加载器来加载Driver实现,从而破坏了双亲委派模型。


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

相关文章

tomcat类加载机制

目录 一、JVM类加载机制简介 二、TOMCAT类加载机制 三、违反双亲委托机制 一、JVM类加载机制简介 简述JVM双亲委派模型: JVM中包括集中类加载器: BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用类加载器Custom…

JAVA类加载机制详解

上一篇文章我们简单说了一下类的创建过程,但是如果JVM需要加载类,会经过哪些具体的过程呢?下面我们就来谈一谈。 要了解加载类的过程,我们就必须要了解类加载器。 在很多初学者刚听到类加载器的时候觉得很高大上,其实…

Android 类加载机制

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

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

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

Tomcat 的类加载机制

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

java类加载机制

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

类加载机制详解

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

类的加载机制

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

类加载机制

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

双亲委派模型的破坏

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

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

一:背景 类加载机制是在我们的真个java的运行阶段中的其中一个阶段。 二:什么是快乐星球(类加载机制) 我们编写的 Java 文件都是以.java 为后缀的文件,编译器会将我们编写的.java 的文件编译成.class 文件,简单来说类加载机制就是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模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。 OSI网络模型按照…

TCP/IP五层(四层)模型

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

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

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

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

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

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

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

读懂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.协议栈各层的功能 协议栈分层设计达到了解耦目…