什么是类加载器?什么是双亲委派模型?
发布于 2024-07-17
761
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
springboot葵花宝典
扫码关注公众号
扫码阅读
手机扫码阅读
什么是类加载器?什么是双亲委派模型?
1. 什么是类加载器,类加载器有哪些?
类加载器是用于将字节码文件加载到JVM中,使Java程序得以启动。它是java.lang.ClassLoader的子类,负责找到或生成指定类的字节码文件,同时加载程序所需的资源。
类加载器分为四种类型:
- 启动类加载器(BootStrap ClassLoader):由C++编写,加载JAVA_HOME/jre/lib目录下的类库。
- 扩展类加载器(ExtClassLoader):加载JAVA_HOME/jre/lib/ext目录中的类库。
- 应用类加载器(AppClassLoader):加载classPath下的类,即开发者编写的Java类。
- 自定义类加载器:开发者自定义的类加载规则。
2. 什么是双亲委派模型?
双亲委派模型是一种类加载机制。当类加载器接到加载请求时,优先将请求委派给父类加载器,递归至顶层的启动类加载器。如果父类加载器无法完成加载,则由子类加载器尝试加载。这种机制确保了类加载过程的安全性和唯一性。
3. JVM为什么采用双亲委派机制?
JVM采用双亲委派机制主要基于两个原因:
- 避免重复加载:通过父类加载器加载的类无需重复加载,确保唯一性。
- 安全性保障:防止核心API库被恶意篡改。例如,尝试自定义java.lang.String类会因双亲委派机制导致加载失败。
4. 类装载的执行过程
类的生命周期包括以下七个阶段:
- 加载:获取类的二进制数据流,并解析为方法区内的数据结构,同时生成java.lang.Class实例。
- 验证:检查类文件是否符合JVM规范,包括文件格式、元数据、字节码和符号引用验证。
- 准备:为类变量分配内存并设置初始值,static变量的赋值处理在准备或初始化阶段完成。
- 解析:将符号引用转换为直接引用。
- 初始化:执行静态变量和静态代码块的初始化操作,优先初始化父类。
- 使用:JVM执行用户程序代码,调用静态成员或实例化对象。
- 卸载:程序结束后,销毁创建的Class对象,JVM退出内存。
5. 类加载器面试问题
面试常见问题:
- 类加载器有哪些? JVM运行二进制文件,常见类加载器包括启动类加载器、扩展类加载器、应用类加载器和自定义类加载器。
- 类装载执行过程? 类从加载到卸载经历加载、验证、准备、解析、初始化、使用和卸载七个阶段。
- 双亲委派模型是什么? 类加载请求依次委派至父类加载器,只有父类无法加载时,子类加载器才尝试加载。
- JVM为何采用双亲委派机制? 避免类重复加载,确保唯一性;防止恶意篡改核心API库。
springboot葵花宝典
springboot葵花宝典
扫码关注公众号
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
查看方案
springboot葵花宝典的其他文章
SpringBoot-11-文件的上传和下载
本章节我们主要进行SpringBoot文件上传和下载以及的介绍涉及到Thumeleaf以及静态资源的设置,因为我们在进行项目开发的时候,经常会遇见需要用到文件上传和下载的时候,例如:通知文档下载,辞职报告模板的下载,员工批量录入需要文件上传
WebSocket快速入门
WebSocket 是基于 TCP 的一种新的**网络协议**。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建**持久性**的连接, 并进行**双向**数据传输
Arthas常用命令
Arthas常用命令
Linux 下查看内存使用情况的方法总结,看完这篇就够了
Linux 下查看内存使用情况的方法总结,看完这篇就够了
OpenFeign 与 Spring Cloud:优雅地实现微服务间的通信
OpenFeign 是一款功能强大的微服务远程调用工具,它能够简化我们在微服务架构中的开发和通信。无论是小型项目还是大规模分布式系统,OpenFeign 都能够满足您的需求。
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线