什么是类加载器?什么是双亲委派模型?
发布于 2024-07-17
1124
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
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葵花宝典的其他文章
Elasticsearch(ES)搜索结果排序、分页和高亮
Elasticsearch(ES)搜索结果处理排序、分页和高亮
保护用户隐私:Spring Boot 数据脱敏实战
保护用户隐私:Spring Boot 数据脱敏实战
Nacos 注册中心:微服务架构的不二选择
在当今的软件开发领域,微服务架构已经成为构建高可扩展性和灵活性系统的首选方案。而作为微服务架构中重要的一环,服务注册中心扮演着关键的角色。在众多选择中,Nacos 注册中心凭借其强大的功能和便捷性,成为了业界爆款。
Sentinel安装和项目整合Sentinel
Sentinel安装和项目整合Sentinel
Vue结合Element实现+SpringBoot实现前后端CURD
Vue结合Element实现+SpringBoot实现前后端CURD在本
加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线
白皮书上线