我正在使用扩展URLClassLoader的自定义类加载器。我将一些类加载到我的自定义类加载器中并执行一些任务。任务完成后,我想处理类加载器。我尝试将引用设置为null。
但这并不是垃圾收集类加载器。
有没有办法可以帮助我想要实现的目标?
答案 0 :(得分:3)
基本上,正如@invariant已经指出的那样,取消引用特定类加载器加载的所有类应该使该类加载器具有垃圾收集性。但是,(至少)有一个例外:如果一个类被序列化,那么该类(以及它的类加载器)将由ObjectStreamClass
在内部保持引用,这是一个原始类,因此永远不会被垃圾回收。因此,在这种情况下,在整个JVM终止之前,不能对类加载器进行垃圾收集。
请参阅“与垃圾收集和序列化相关的问题”部分中的完整说明here。
答案 1 :(得分:2)
来自ClassLoader doc:Every Class object contains a reference to the ClassLoader that defined it
。这会阻止您的装载机被收集。您也必须将对类和类的实例的所有引用都归零。
答案 2 :(得分:1)
在http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950148有一个6岁的小虫似乎就是你想要的。遗憾的是,似乎还没有实现这样的功能......
答案 3 :(得分:1)
在没有ClassLoader创建的类实例之后,ClassLoader将被垃圾收集。有一个旧的错误(4950148)与无法明确处理ClassLoader相关,这会导致问题,例如文件锁定。
答案 4 :(得分:0)
只要引用此类加载器加载的任何类,类加载器就不会被垃圾回收。因此,如果以下情况,将删除类加载器:对类加载器的所有直接引用都是空的,对此类加载器加载的类的所有引用以及这些类的实例。然后它可以转储到垃圾收集器的下一次运行。