JVM类加载器

JVM类加载分为:

  • 跟类加载器:Bootstrap类加载器,由c++编写,主要负责加载虚拟机核心类库的加载。
  • 扩展类加载器:主要是加载JAVA_HOME下面的jre/lb/ext子目录里面的类库,该加载器是由纯JAVA语言实现的,是跟类加载器的子加载器。
  • 系统类加载器:主要负责classpath下的类库资源加载,其父类加载器是扩展类加载器,它也是默认的自定义类加载器。
    双亲委托机制:一个类加载被loadclass调用之后,并不会将其直接加载,而是交给当前类加载器的父加载器加载,直到最顶层的类加载器,然后依次向下加载。
    双亲委托加载机制图
    破环双亲加载机制:
  • 有过web项目部署经验的人都知道,热部署是经常要用的,热部署的原理也就是使用自定义类加载器进行类卸载和重新加载(三大类加载器是无法卸载的)

类加载起的命名空间、运行时包、类的卸载等等:

  • 类加载器命名空间:
    每一个类都有各自的命名,其在加载器中的同一个class是独一无二的。
  • 运行时包:
    我们对每一个类都指定一个包,在同一个类加载器中,class的命名是由包名加类名组成,这样也是保证每一个class在同一个类的独一无二的命名。
  • 初始类加载器:
    根据JVM规定,所有参与的类加载,即使没有亲自加载该类,也都会被标示为该类的初始化类加载器。
  • 类的卸载
    JVM规定只有满足下面三个条件才能被卸载(GC回收):
    • 该类的实例已经被GC
    • 加载该类的classloader被回收
    • 该类的class实例没有在其他地方被引用。
  • 总结:
    • JVM三大类加载,它们使用双亲加载机制。双亲加载机制是包含关系,并非被继承关系。
    • 希望能交流更多技术,关注小白的微信公众号吧。
      在这里插入图片描述
小白技术社
原文地址:https://www.cnblogs.com/xbjss/p/13326681.html