一、类加载器的命名空间
- 每个类加载器都有自己的命名空间,命名空间由该类加载器及其所有父类加载器所加载的类组成。
- 同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类。
- 在不同的命名空间中,有可能出现类的完整名字(包括类的包名)相同的两个类。
二、类的卸载
- 当类被加载、连接、初始化之后,它的生命周期就开始了。当代表该类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期。类在方法区内的数据结构也会被卸载,从而结束该类的生命周期。
- 一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。
- 由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。Java虚拟机自带的类包括:根类加载器、扩展类加载器、系统类加载器。Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用由它们所加载的类的Class对象,因此这些Class对象始终是可触及的。而由用户自定义的类加载器及其所加载的类时可以被卸载的。
三、监测类被卸载的jvm参数
-XX:+TraceClassUnLoading
四、类加载器是对象,并非类
同一个类加载器的实例可以作为另一个实例的父类加载器。
五、满足类卸载的条件
- 该类的类加载器已经被卸载
- 该类的所有实例对象都已经被回收
- 在任何地方都不能访问到该类的Class对象,如:不能通过反射访问到该类的方法、属性等信息。