【JVM】JVM类加载机制

article/2025/9/22 4:02:33

【JVM】JVM类加载机制

类加载子系统(类加载机制)

类加载器

类加载器(classloader)的作用
加载 .class 文件(平台无关的二进制字节码文件)

classloader 有两种装载class的方式 (时机)
隐式:运行过程中,碰到new方式生成对象时,隐式调用classLoader到JVM
显式:通过class.forname()动态加载

类加载过程

装载器把一个类装入JVM中要要经过三个步骤来完成
1. 装载:查找和装入类或接口的二进制数据。
2. 连接:执行以下三步,其中解析是可选的

 (1) 验证:检验装入类或接口的二进制数据的正确性。(2) 准备:为静态变量分配存储空间。(3) 解析:将常量池内的符号引用替换为直接引用。

3. 初始化:激活类的静态变量和静态Java代码块。

类加载器的层次关系

类加载器 classloader 是具有层次结构的,也就是父子关系。其中,Bootstrap 是所有类加载器的父亲。如下图所示:

这里写图片描述

Bootstrap class loader: 父类 当运行 java 虚拟机时,这个类加载器被创建,它负责加载虚拟机的核心类库,如 java.lang. 等。例如 java.lang.Object 就是由根类加载器加载的。需要注意的是,这个类加载器不是用 java 语言写的,而是用 CC++ 写的。

Extension class loader 这个加载器加载出了基本 API 之外的一些拓展类。

AppClass Loader 加载应用程序和程序员自定义的类。

除了以上虚拟机自带的加载器以外,用户还可以定制自己的类加载器(User-defined Class Loader)。Java 提供了抽象类 java.lang.ClassLoader,所有用户自定义的类加载器应该继承 ClassLoader 类。
这是JVM分工自治生态系统的一个很好的体现。

双亲委派模型(Parent Delegation Model)

JVM内置了三个默认的装载器
BootstrapLoader
ExtClassLoader
AppClassLoader

这里写图片描述

BootstrapLoader是由C/C++实现,我们无法在程序中获取它的实例,这个装载器负责装载lib目录下的dt.jar、tools.jar等Java核心核心类库。

ExtClassLoader这个装载器负责装载jdk/lib/ext目录下的jar包。

AppClassLoader这个装载器主要负责装载classpath目录下的类。

这三个装载器存在层级关系是,
BootstrapLoader为ExtClassLoader的父装载器,
ExtClassloader为AppClassLoader的父装载器。

类的装载遵循“双亲委派”模式,如果AppClassLoader被请求装载一个类,它首先会去询问ExtClassLoader是否已经装载,如果已经装载,则返回其对象;如果尚未装载,会继续询问BootstrapLoader,也就是说BootstrapLoader拥有最高的优先级。

类的加载过程采用双亲委托机制,这种机制能更好的保证 Java 平台的安全。该模型要求除了顶层的Bootstrap class loader启动类加载器外,其余的类加载器都应当有自己的父类加载器。
子类加载器和父类加载器不是以继承(Inheritance)的关系来实现,而是通过组合(Composition)关系来复用父加载器的代码。
每个类加载器都有自己的命名空间(由该加载器及所有父类加载器所加载的类组成,在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类;在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类)。

双亲委派模型的工作过程为:
1.当前 ClassLoader 首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。
每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存, 等下次加载的时候就可以直接返回了。

2.当前 classLoader 的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到 bootstrap ClassLoader。

3.当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

使用这种模型来组织类加载器之间的关系的好处,主要是为了安全性,避免用户自己编写的类动态替换 Java 的一些核心类,比如 String,同时也避免了重复加载,因为 JVM 中区分不同类,不仅仅是根据类名,相同的 class 文件被不同的 ClassLoader 加载就是不同的两个类,如果相互转型的话会抛java.lang.ClassCaseException.


声明:图片来自源于网络。这是之前整理的word笔记,没有注明图片具体来源,抱歉。在此向贡献图片的人表示感谢。


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

相关文章

源码剖析JVM类加载机制

1 前言 我们平常开发中,都会部署开发的项目或者本地运行main函数之类的来启动程序,那么我们项目中的类是如何被加载到JVM的,加载的机制和实现是什么样的,本文给大家简单介绍下。 2 类加载运行全过程 当我们用java命令运行某个类…

JVM类加载机制简单介绍

本文为《深入理解Java虚拟机JVM高级特效与最佳实践(第三版)》一书的摘要总结 类加载时机 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型&#xff0…

JVM的类加载机制

一、类加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内****,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象&…

深入JVM类加载机制

从ClassLoad开始说起 ClassLoader顾名思义就是我们所常见的类加载器,其作用就是将编译后的class文件加载内存当中.在应用启动时,JVM通过ClassLoader加载相关的类到JVM当中.在具体了解ClassLoader之前我们先来了解下JVM的类加载机制. 1. 类加载机制 虚拟机将class文件加载到内…

java面试题-JVM类加载机制

类加载的生命周期? 1. 加载阶段(Loading) 在Java程序中,当需要使用某个类时,JVM会使用类加载器来查找并加载该类文件。类加载器会首先从文件系统或网络中查找相应的 .class 文件,读取类的二进制数据&#x…

JVM面试 类加载机制

JVM的类加载机制 一、JVM的运行机制 JVM 是用于运行Java字节码的虚拟机,包括一套字节码指令集,一组程序寄存器,一个虚拟机栈,一个虚拟机堆,一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设…

JVM--详解类加载机制

JVM--详解类加载机制 转载:https://blog.csdn.net/championhengyi/article/details/78680700 Java虚拟机的体系结构 前面我们探讨了Class文件的结构,如果你还没有学习,将不利于这部分知识的吸收与掌握,所以请移步:JV…

JVM类加载机制

文章目录 概述1. 类加载器2.类加载过程3.双亲委派机制总结 概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许…

JVM:类加载机制

类加载器 什么是类加载器 ​ 类加载器的作用负责从磁盘中或者网络中加载class文件,classloader只负责加载class文件,类加载器通过一个类的全限定名来获取描述此类的二进制字节流。类加载器虽然用于实现加载动作,但它在Java程序中起到的作用…

JVM类的加载机制

1 类的加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象&#xf…

jvm之java类加载机制和类加载器(ClassLoader)的详解

手把手写代码:三小时急速入门springboot—企业级微博项目实战--->csdn学院 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步…

二叉树的遍历

遍历一棵二叉树有很多种方法。假如用D、L、R分别代表二叉树的根结点、左子树、右子树,那么要遍历这棵二叉树,方法就有6种:DLR、DRL、LDR、LRD、RDL、RLD。一般在遍历时遵循先左后右的原则,因此常用的遍历方法有三种:DL…

二叉树的遍历详解

概述 二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是访问父节点的次序。在遍历过程中,若访问顺序是父节点-左孩子节点-右孩子节点,就是先序遍历,…

“二叉树遍历“详解 以及 二叉树的实现

目录 一.二叉树的遍历 1.二叉树的遍历的解释: 2.二叉树的遍历有三种递归结构 (1) 实现先序遍历: (2) 实现中序遍历: (3) 实现后序遍历: (4) 二叉树的层序遍历 层序遍历代码: 二.二叉树的递归实现相关函数讲解…

二叉树遍历详解

二叉树的遍历方式是最基本,也是最重要的一类题目,我们将从「前序」、「中序」、「后序」、「层序」四种遍历方式出发,总结他们的递归和迭代解法。 一、二叉树定义 二叉树(Binary tree)是树形结构的一个重要类型…

讲透学烂二叉树(三):二叉树的遍历图解算法步骤及JS代码

二叉树的遍历是指不重复地访问二叉树中所有结点,主要指非空二叉树,对于空二叉树则结束返回。 二叉树的遍历分为 深度优先遍历 先序遍历:根节点->左子树->右子树(根左右),有的叫:前序遍历…

二叉树的中序遍历算法(Java三种实现方法)

文章目录 题目一、二叉树的节点定义二、三种遍历方法1.递归算法思想 2.迭代算法思想 3.Morris 中序遍历算法思想 总结 题目 给定一个二叉树的根节点 root ,返回它的 中序 遍历 一、二叉树的节点定义 public class TreeNode {int val;TreeNode left;TreeNode righ…

二叉树遍历的几种常见方法

二叉树的遍历方法 一.二叉树分类: 完全二叉树满二叉树扩充二叉树平衡二叉树 二.二叉树的四种遍历方式: 前序遍历(先根,再左,最后右)中序遍历(先左,再根,最后右&#…

二叉树的三种遍历方式

目录 1.二叉树的结构: 2.二叉树的前序遍历: 3.二叉树的中序遍历: 4.二叉树的后序遍历: 5.二叉树前、中、后序的代码实现: 前序遍历函数: 中序遍历函数: 后序遍历: 完整代码&am…

图解二叉树的三种遍历

1、二叉树的遍历 前序遍历:根结点 —> 左子树 —> 右子树 中序遍历:左子树—> 根结点 —> 右子树 后序遍历:左子树 —> 右子树 —> 根结点 层次遍历:仅仅需按层次遍历就可以 前序遍历:1 2 4 5 7…