type
status
date
slug
summary
tags
category
icon
password
我们平常写的java文件都需要经过编译和类加载,编译就是将我们写的.java文件编译成.class文件,而类加载则是通过类加载器去将.class加载到jvm内存中,其中使用的类加载机制就是双亲委派机制。

类加载器

jvm在类加载的时候会产生三个类加载器及,分别的启动类加载器,加载java核心类库。扩展类加载器,写程序用到的其他导入的类库。应用类加载器,加载自己写的类,除了这些加载器,还可以使用classloader类自己定义类加载器。
notion image

双亲委派机制

双亲委派机制就是安装类加载器的层级关系来进行类加载,比如属于应用类加载器加载的类首先不在一开始就加载,会去请示上一层加载器,也就是扩展类加载器去加载,而扩展类加载器这时候也不会去查询和加载,而是交给启动类加载器,启动类看自己的范围没有则会下放给扩展类加载器,扩展类加载器也没有,则才交给应用类加载器去加载。
notion image

双亲委派机制的好处

  • 安全性,保护核心类以及被加载类不被覆盖
  • 避免重复加载,如果父类加载器已经加载,子类加载器再加载,在调用的时候程序到底读取那个呢?

双亲委派机制的打破

类加载机制也不是哪里都适用,比如tomcat就打破了这个机制,由于Tomcat是一个Web容器,其可能部署很多个应用程序,不同的程序可能依赖同一个第三方库,但是版本不同,但是不同版本的库中某一个类的全路径名可能相同,用双亲委派机制是不能加载相同的类(一个类的唯一性由类加载器和全限定名决定),所以tomcat破坏度了双亲委派机制,提供隔离机制,为每一个web容器单独提供了webAppClassLoader加载器会优先加载应用目录下的类,加载不到再交给SharedClassLoader加载

个人理解

双亲委派机制其实就是一种策略,体现了被加载类的一个优先级吧,java核心类库最重要,其次是扩展的类库,再之后才是自己写的,如果没有这样的规定jvm类加载的时候类就会非常混乱,程序运行起来也会非常混乱。
6月份随想Mysql索引
  • Giscus
  • Utterance