什么是类加载器?什么是双亲委派模型?

发布于 2024-07-17
708

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

扫码阅读
手机扫码阅读

什么是类加载器?什么是双亲委派模型?

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. 类装载的执行过程

类的生命周期包括以下七个阶段:

  1. 加载:获取类的二进制数据流,并解析为方法区内的数据结构,同时生成java.lang.Class实例。
  2. 验证:检查类文件是否符合JVM规范,包括文件格式、元数据、字节码和符号引用验证。
  3. 准备:为类变量分配内存并设置初始值,static变量的赋值处理在准备或初始化阶段完成。
  4. 解析:将符号引用转换为直接引用。
  5. 初始化:执行静态变量和静态代码块的初始化操作,优先初始化父类。
  6. 使用:JVM执行用户程序代码,调用静态成员或实例化对象。
  7. 卸载:程序结束后,销毁创建的Class对象,JVM退出内存。

5. 类加载器面试问题

面试常见问题:

  • 类加载器有哪些? JVM运行二进制文件,常见类加载器包括启动类加载器、扩展类加载器、应用类加载器和自定义类加载器。
  • 类装载执行过程? 类从加载到卸载经历加载、验证、准备、解析、初始化、使用和卸载七个阶段。
  • 双亲委派模型是什么? 类加载请求依次委派至父类加载器,只有父类无法加载时,子类加载器才尝试加载。
  • JVM为何采用双亲委派机制? 避免类重复加载,确保唯一性;防止恶意篡改核心API库。

springboot葵花宝典

主要分享JAVA技术,主要包含SpringBoot、SpingCloud、Docker、中间件等技术,以及Github开源项目

274 篇文章
浏览 245.9K

还在用多套工具管项目?

一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。

加入社区微信群
与行业大咖零距离交流学习
PMO实践白皮书
白皮书上线