JVM基础 -> Java中有哪些类加载器? 类加载器工作原理?

16 篇文章 3 订阅

Java中有哪些类加载器? 类加载器工作原理?

JDK⾃带有三个类加载器:bootstrap ClassLoaderExtClassLoaderAppClassLoader

BootStrapClassLoader(引导类加载器):

  • 根类加载器,依赖于底层操作系统,由C编写而成
  • 默认负责加载jre\lib⽂件夹下的jar包和class⽂件。
  • 负责加载虚拟机的核心类库,如java.lang.*。Object类就是由根类加载器加载的

ExtClassLoader(标准扩展类加载器):

  • 它的父加载器为根类加载器,是AppClassLoader的⽗类加载器,由java编写而成
  • 负责加载jre\lib\ext⽂件夹下的jar包和class类。
  • 如果把我们的jar文件放在该目录下,也会自动由扩展类加载器加载。
    • ext目录:extend 翻译过来就是扩展, 也就是存放扩展的资料,就不属于Java自带的,也就是那些程序需要用到的jar包

AppClassLoader(应用程序类路径类加载器丶系统类加载器):

  • 它的父加载器为扩展类加载器。由java编写而成
  • 它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,是用户自定义的类加载器的默认父加载器

类加载器工作原理

  • Java类加载器是用来在运行时加载类(*.class文件)
    • 也就是jvm解释器工作的时候,将.class文件解释为二进制机器码文件

工作的流程

双亲委派机制: 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类(双亲)加载器完成。

  1. 首先判断该类之前是否已加载,逐级向父类判断之前是否加载,之前加载过就结束

  2. 若之前都没加载,则传自顶向下调用双亲加载器加载

  3. 若父类加载器都没能成功加载它,则自己用findClass()去加载.所以是个向上递归的过程

  • 如果所有加载器都找不到,就会丢出NoClassDefFoundError
  • ClassNotfoundException是在编译时JVM加载不到.java文件导致的;
    • .java文件编译为.class文件时找不到java文件
  • NoClassDefError是在运行时JVM加载不到.class文件导致的;
    • .class文件解释为二进制机器码文件时找不到.class文件
  • 类加载器是在运行阶段,过了编译期来到了解释阶段,类加载器工作时,就不会出现ClassNotfoundException

img

为什么要使用这种机制?

  • 是因为父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。

    • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
  • 如果不使用这种委托模式,那就可以随时使用自定义的String替代java的String,这是不行的

大帅比,点赞了没?

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值