学习JVM-基础篇-类加载器&双亲委派机制

什么是类加载器

负责把磁盘上的 .class 字节码文件加载进 JVM 内存,并在内存中生成对应的 Class 对象的工具。

分类
  1. 启动类加载器(Bootstrap ClassLoader)

    C++实现,加载 JDK 核心类库

  2. 扩展类加载器(Extension ClassLoader)

    Java 实现,加载 JRE 扩展目录里的类

  3. 应用类加载器(App ClassLoader)

    Java 实现,加载我们项目 classpath 下的自己写的类

  4. 自定义类加载器

    继承 ClassLoader 实现,加载网络、加密等特殊位置的类

双亲委派机制

当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载。

描述一个类加载的过程(自己写的类)

当一个类需要被加载时,首先交给应用类加载器处理,应用类加载器不直接处理,把请求交给父类扩展类加载器;扩展类加载器同样委派,交给父类启动类加载器;启动类加载器检查是否是 JDK 核心类,无法加载自定义类,将请求退回给扩展类加载;扩展类加载器也无法加载,退回给应用加载器,应用类加载器在项目路径下找到并加载该类,完成整个过程。

双亲委派机制的作用

①保证安全性,避免恶意代码替换JDK 中的核心类库

②避免重复加载,可以避免同一个类被多次加载

打破双亲委派机制

自定义类加载器,重写 loadClass() 方法,不按照默认的双亲委派逻辑执行即可。

  • 默认 ClassLoader.loadClass() 实现了双亲委派逻辑

  • 只重写 findClass() 不会打破双亲委派;

  • 只有重写 loadClass(),自己实现加载逻辑,不向上委派,才算打破。

相关推荐
今天的砖头有点烫手啊21 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm
凯凯姜21 小时前
JVM 内存持续增长与 Full GC 频繁
jvm
驭渊的小故事1 天前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
香蕉大香蕉(06敬畏市场)2 天前
高频八股 · Java 并发编程(10):异步、ThreadLocal 与虚拟线程(收官)
java·开发语言·网络·jvm·python·ai·实习
wuminyu2 天前
JVM规范学习总结-Class文件结构
java·linux·c语言·jvm·c++
酌沧3 天前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
wuminyu3 天前
JVM规范学习总结-Java源码经过javac编译后产物
java·linux·c语言·jvm·c++
学到老活到老4 天前
类已经加载了,为什么静态代码还没执行?
java·jvm
学到老活到老4 天前
写了 new,就一定会在堆上分配对象吗?
java·jvm
笨笨饿4 天前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机