Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

为什么会有类卸载一说

在一些场景中,比如java agent技术,我们attach到目标jvm的agent中的类被加载并且使用完后,它的使命就完成了,留着占用jvm内存,这时候就需要卸载掉。

如何卸载

在之前的文章中有分享过类加载,有类加载就有类卸载,当这个类的Class对象不再被引用时,那它的生命周期就结束了。我们需要理解这么几个概念:

  • 类加载器
  • Class对象
  • 类的实例。

我们知道,类是由类加载器加载进来的,即ClassLoader加载Class. 然后,需要注意的是这里JVM自带的ClassLoaderClass是互相引用的,比如,Class对象是有一个getClassLoader方法来获得它的类加载其的。

同时,类的实例持有Class对象的引用,这一点可以从Object类的getClass方法中得知。

正如前面所说,JVM自带的类加载器会一直持有它所加载的Class对象的引用,这就意味着由JVM自带的类加载器加载的类是无法被卸载的。所以我们如果想要被加载的类能够被卸载,就需要自定义类加载器,其具体做法就是继承ClassLoader类,然后复写findClass()方法。

会有什么问题

评论