JVM类加载分为:
- 跟类加载器:Bootstrap类加载器,由c++编写,主要负责加载虚拟机核心类库的加载。
- 扩展类加载器:主要是加载JAVA_HOME下面的jre/lb/ext子目录里面的类库,该加载器是由纯JAVA语言实现的,是跟类加载器的子加载器。
- 系统类加载器:主要负责classpath下的类库资源加载,其父类加载器是扩展类加载器,它也是默认的自定义类加载器。
双亲委托机制:一个类加载被loadclass调用之后,并不会将其直接加载,而是交给当前类加载器的父加载器加载,直到最顶层的类加载器,然后依次向下加载。
破环双亲加载机制: - 有过web项目部署经验的人都知道,热部署是经常要用的,热部署的原理也就是使用自定义类加载器进行类卸载和重新加载(三大类加载器是无法卸载的)
类加载起的命名空间、运行时包、类的卸载等等:
- 类加载器命名空间:
每一个类都有各自的命名,其在加载器中的同一个class是独一无二的。 - 运行时包:
我们对每一个类都指定一个包,在同一个类加载器中,class的命名是由包名加类名组成,这样也是保证每一个class在同一个类的独一无二的命名。 - 初始类加载器:
根据JVM规定,所有参与的类加载,即使没有亲自加载该类,也都会被标示为该类的初始化类加载器。 - 类的卸载
JVM规定只有满足下面三个条件才能被卸载(GC回收):- 该类的实例已经被GC
- 加载该类的classloader被回收
- 该类的class实例没有在其他地方被引用。
- 总结:
- JVM三大类加载,它们使用双亲加载机制。双亲加载机制是包含关系,并非被继承关系。
- 希望能交流更多技术,关注小白的微信公众号吧。