为什么会有类卸载一说
在一些场景中,比如java agent技术,我们attach到目标jvm的agent中的类被加载并且使用完后,它的使命就完成了,留着占用jvm内存,这时候就需要卸载掉。
如何卸载
在之前的文章中有分享过类加载,有类加载就有类卸载,当这个类的Class对象不再被引用时,那它的生命周期就结束了。我们需要理解这么几个概念:
- 类加载器
- Class对象
- 类的实例。
我们知道,类是由类加载器加载进来的,即ClassLoader
加载Class
. 然后,需要注意的是这里JVM自带的ClassLoader
和Class
是互相引用的,比如,Class对象是有一个getClassLoader
方法来获得它的类加载其的。
同时,类的实例持有Class对象的引用,这一点可以从Object
类的getClass
方法中得知。
正如前面所说,JVM自带的类加载器会一直持有它所加载的Class对象的引用,这就意味着由JVM自带的类加载器加载的类是无法被卸载的。所以我们如果想要被加载的类能够被卸载,就需要自定义类加载器,其具体做法就是继承ClassLoader
类,然后复写findClass()
方法。