JAVA类的卸载

首先了解一下类加载器的类型,有三大类,分别为启动类加载器,扩展类加载器和应用类加载器,其中应用类加载器又可以分为系统类加载器和用户自定义加载器。

这里面,启动类加载器,扩展类加载器和系统类加载器加载的类在JVM整个生命周期中都不会被卸载,只有自动加载器加载的类可以被卸载。注意,类被卸载和对象被回收是两码事。

自定义加载器加载的类什么时候被卸载类的实例的生命周期何时结束。

先看一下如何使用自定义加载器加载一个类,并创建类的实例。

MyClassLoader loader = new MyClassLoader("loader");
loader.setPath("D:\\myapp\\server\\");
Class clazz = loader.loadClass("Sample");
Object obj = clazz.newInstance();

代码也许不准确,但是过程很清晰,整个过程涉及三个变量,而且他们之间的引用关系很明确,即实例对象引用着类,类引用着类加载器,调用类的getClassLoader()方法可以获得该类的加载器。

要想卸载类必须先卸载该类的加载器,这很好理解,因为类引用着类加载器。

那么类的生命周期什么时候结束呢?只有当这个类的加载器和类的实例都结束了生命周期,这个类的生命周期才结束。即

loader = null;
obj = null;
clazz = null;

这就可以进行类卸载了。

有一种情况,就是类加载器被卸载掉了,但是类还没有被卸载掉,这个时候如果有需要用这个类,就可以重新使用不需要加载,方法区的二进制数据结构也是原来的。如果类已经被卸载了,就需要重新加载这个类,当然方法区中的数据结构以及类信息都是重新加载的。

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/84331890