首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
分布式数据库
›
【JVM】类加载器和双亲委派模子
返回列表
发新帖
【JVM】类加载器和双亲委派模子
[复制链接]
发表于 2026-2-14 16:18:23
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
什么是类加载器
如果想要相识什么是类加载器就须要清晰一个Java文件是怎样运行的。我们可以看下图:
起主要知道操纵体系是不能直接运行Java文件的,以是就须要通过JVM将Java文件转换为操纵体系可以运行的文件范例,步调如下:
类加载器把Java
代码
转换为字节码文件
运行时数据区将字节码文件加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层操纵体系来实行,而是须要有实行本领的实行引擎来运行
实行引擎将字节码翻译为底层体系指令,再交给CPU来实行,而这个时间须要调用别的语言的本地库接口来实现整个步伐的
功能
JVM只会运行二进制文件,而
类加载器
(ClassLoader)的重要作用就是将
字节码
文件加载到
JVM
中 ,从而让Java步伐可以或许启动起来。现有的类加载器根本上都是 java.lang.ClassLoader的子类,该类的只要职责就是用于将指定的类找到或天生对应的字节码文件,同时类加载器还会负责加载步伐所须要的资源
类加载器的范例
类加载器根据各自的加载范围差别,举行了分别重要是四种:
启动类加载器
:这个类并不继续ClassLoader类,此中是由C++编写实现。用于加载JAVA_Home/jre/lib目次下的类库
扩展类加载器
:该列是ClassLoader的子类,重要是加载JAVA_HOME/jre/lib/ext目次中的类库
应用类加载器
:该类时ClassLoader的子类,重要是用于加载classPath下的类,也就是加载开辟者本身编写的Java类
自界说类加载器
:开辟者自界说类继续ClassLoader,实现自界说类加载规则
上述三种类加载器的条理结构如下如下:
而类加载器的体系不是继续关系的,而是
委派体系
,类加载器起首会到本身的父亲中查找类和资源,如果找不到才回到本身的本地举行查找。类加载器的委托举动动机是为了制止类似的类被多次加载
双亲委派模子
如果一个类加载器在接到加载类的哀求时,它起首不会本身实行去加载这个类, 而是把这个哀求任务委托给父类加载器去完成,依次递归,如果父类加载器可以 完成类加载任务,就返回乐成;只有父类加载器无法完成此加载任务时,才由下一级去加载
那么为什么会须要使用双亲委派模子呢?
通过双亲委派机制可以制止某一个类被重复加载,当父类已经加载后则无需重复加载,包管唯一性
为了
安全
,包管类库
API
不会被修改
这里表明一下怎样包管类库的
API
不会被修改:当我们创建一个类String的时间,由于在Java中本身就存在String类,以是使用双亲委派模子的时间,在启动类加载器就会加载Java中的String类,而不会使用应用类加载器举行加载。
public class String {
public static void main(String[] args) {
System.out.println("demo info")
}
}
复制
代码
此时实行main函数,会出现非常,在类 java.lang.String 中找不到 main 方法
出现该信息是由于由双亲委派的机制,java.lang.String的在启动类加载器 (Bootstrap classLoader)得到加载,由于在核心jre库中有其类似名字的类文件, 但该类中并没有main方法。如许就能防止恶意窜改核心
API
库
类装载的过程
类从加载到JVM中开始,它的整个生命周期包罗了:加载、验证、预备、剖析、初始化、使用和卸载七个阶段。此中,验证、预备息争析这三个部分统称为毗连
加载
加载时重要的作用是以下三点:
通过类的全名,获取类的二进制数据流
剖析类的二进制数据流为方法区内的数据结构(Java类模子)
创建java.lang.Class类的实例,表现该范例。作为方法区这个类的各种数据的访问入口
上面说的大概长处难以明白,以这个图片来教学一下它的作用。就比如当前有一个Person举行类的加载,那么他重要是分为两个部分,第一部分将Person中界说的字段以及方法
存储
到元空间中,第二部分时将实例化的对象
存储
到堆中,而堆当中的实例化对象的对象头会指向当前的class对象,然后class对象指向元空间的数据结构
验证
验证类是否符合 JVM 规范,
安全
性查抄
文件格式验证:是否符合Class文件的规范
元数据验证
这个类是否有父类(除了Object这个类之外,别的的类都应该有父类)
这个类是否继续(extends)了被final修饰过的类(被final修饰过的类表现类不能被继续)
类中的字段、方法是否与父类产生抵牾。(被final修饰过的方法或字段是不能覆盖的)
字节码验证
重要的目的是通过对数据流和控制流的分析,确定步伐语义是合法的、符合逻 辑的
符号引用验证:符号引用以一组符号来形貌所引用的目的,符号可以是任何情势的字面量
预备
为类变量分配内存并设置类变量初始值
static变量,分配空间在预备阶段完成(设置默认值),赋值在初始化阶段完成
static变量是final的根本范例,以及字符串常量,值已确定,赋值在预备阶段完成
static变量是final的引用范例,那么赋值也会在初始化阶段完成
public class Application {
static int b = 10;
static final int c= 20,
static final String d = "hello";
static final Object obj= new Object();
}
复制
代码
剖析
把类中的符号引用转换为直接引用
比如:方法中调用了其他方法,方法名可以明白为符号引用,而直接引用就是使用指针直接指向方法
初始化
对类的静态变量,静态代码块实行初始化操纵
如果初始化一个类的时间,其父类尚未初始化,则优先初始化其父类
如果同时包罗多个静态变量和静态代码块,则按照自上而下的次序依次实行
使用
JVM 开始从入口方法开始实行用户的步伐代码
调用静态类成员信息(比如:静态字段、静态方法)
使用new关键字为其创建对象实例
卸载
当用户步伐代码实行完毕后,JVM 便开始烧毁创建的 Class 对象,末了负责运行的 JVM 也退出内存
回复
使用道具
举报
返回列表
浏览过的版块
DevOps与敏捷开发
移动端开发
物联网
运维.售后
人工智能
Oracle
熊熊出没
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表