当前位置: 代码迷 >> 综合 >> jvm-018(张龙老师jvm教程) 类的命名空间与卸载详解
  详细解决方案

jvm-018(张龙老师jvm教程) 类的命名空间与卸载详解

热度:36   发布时间:2024-02-11 22:36:23.0

一、类加载器的命名空间

  • 每个类加载器都有自己的命名空间,命名空间由该类加载器及其所有父类加载器所加载的类组成。
  • 同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类。
  • 在不同的命名空间中,有可能出现类的完整名字(包括类的包名)相同的两个类。

二、类的卸载

  • 当类被加载、连接、初始化之后,它的生命周期就开始了。当代表该类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期。类在方法区内的数据结构也会被卸载,从而结束该类的生命周期。
  • 一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。
  • 由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。Java虚拟机自带的类包括:根类加载器、扩展类加载器、系统类加载器。Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用由它们所加载的类的Class对象,因此这些Class对象始终是可触及的。而由用户自定义的类加载器及其所加载的类时可以被卸载的。

三、监测类被卸载的jvm参数

     -XX:+TraceClassUnLoading

四、类加载器是对象,并非类

     同一个类加载器的实例可以作为另一个实例的父类加载器。

五、满足类卸载的条件

  • 该类的类加载器已经被卸载
  • 该类的所有实例对象都已经被回收
  • 在任何地方都不能访问到该类的Class对象,如:不能通过反射访问到该类的方法、属性等信息。

 

  相关解决方案