类加载器相关基础知识(面试)

类加载过程

类加载过程可以分为三步:加载->连接->初始化

连接过程又可分为三步:验证->准备->解析

加载这一步主要通过 类加载器 完成

什么是类加载器,类加载器有哪些?

类加载器会加载 Java 类的字节码( .class 文件)到 JVM 中,在内存中生成一个代表该类的 Class 对象

JVM 中内置了三个重要的类加载器:

  1. BootstrapClassLoader(启动类加载器) :最顶层的加载类,由 C++实现,主要用来加载 JDK 内部的核心类库%JAVA_HOME%/lib目录下的 rt.jarresources.jarcharsets.jar等 jar 包和类)。
  2. ExtensionClassLoader(扩展类加载器) :主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类。继承启动类加载器。
  3. AppClassLoader(应用程序类加载器)面向用户 的加载器,负责加载当前应用 classpath 下的所有 jar 包和类 。继承扩展类加载器。
    除了这三种类加载器之外,开发者可以自定义类继承类加载器,实现自定义类加载规则。

什么是双亲委派模型?

在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回

如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这请求委派给父类加载器 去完成(调用父加载器 loadClass()方法来加载类)

因此所有的加载请求 都应该先传输到最顶层的启动类加载器 中。只有当父类加载器返回自己无法完成这个加载请求时,子类加载器才会尝试自己去加载。如果子类加载器也无法加载这个类,那么它会抛出一个 ClassNotFoundException 异常。

JVM为什么采用双亲委派机制

通过双亲委派机制保证了 Java 程序的稳定运行,避免某一个类被重复加载

如何打破双亲委派模型

重写 loadClass() 方法。

重写 loadClass()方法之后,可以改变双亲委派模型的执行流程

例如,子类加载器可以先自己尝试加载这个类,而不是优先委派给父类。

相关推荐
多多*5 分钟前
一个有 IP 的服务端监听了某个端口,那么他的 TCP 最大链接数是多少
java·开发语言·网络·网络协议·tcp/ip·缓存·mybatis
Kay_Liang12 分钟前
Spring IOC核心原理与实战技巧
java·开发语言·spring boot·spring·ioc·依赖注入·控制反转
不惑_17 分钟前
[特殊字符] 在 Linux 上设置 SQLite
linux·jvm·sqlite
Mr.wangh32 分钟前
单例模式&阻塞队列详解
java·开发语言·单例模式·多线程·阻塞队列
Slow菜鸟43 分钟前
Java后端常用技术选型 |(三)分布式篇
java·分布式
q***9941 小时前
Spring Boot 实战:轻松实现文件上传与下载功能
java·数据库·spring boot
张较瘦_1 小时前
[论文阅读] 软件工程 | 解决Java项目痛点:DepUpdater如何平衡依赖升级的“快”与“稳”
java·开发语言·论文阅读
老华带你飞1 小时前
记录生活系统|记录美好|健康管理|基于java+Android+微信小程序的记录生活系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·生活·毕设·记录生活系统
Seven971 小时前
微服务/分布式 基础面试题
java
weixin_456588151 小时前
JVM(java虚拟机)
java·开发语言·jvm