【问题标题】:disposing a class loader配置类加载器
【发布时间】:2010-03-31 10:52:26
【问题描述】:

我正在使用扩展 URLClassLoader 的自定义类加载器。我将一些类加载到我的自定义类加载器中并执行一些任务。任务完成后,我想处理类加载器。我尝试通过将引用设置为 null 来做到这一点。

但这不会垃圾收集类加载器。

有什么方法可以帮助我实现目标吗?

【问题讨论】:

标签: java dispose classloader urlclassloader


【解决方案1】:

基本上,正如@invariant 已经指出的那样,取消引用特定类加载器加载的所有类应该使该类加载器可被垃圾回收。但是,(至少)有一个例外:如果一个类被序列化,则该类(以及它的类加载器)在内部被 ObjectStreamClass 引用,这是一个原始类,因此永远不会被垃圾收集。所以在这种情况下,类加载器也不能被垃圾回收,直到整个 JVM 终止。

请参阅“与垃圾收集和序列化相关的问题”部分中的完整说明 here

【讨论】:

    【解决方案2】:

    来自ClassLoader docEvery Class object contains a reference to the ClassLoader that defined it。这会阻止您的装载机被收集。您还必须取消对这些类和这些类的实例的所有引用。

    【讨论】:

      【解决方案3】:

      http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950148 有一个 6 年前的错误,这似乎是您想要的。不幸的是,似乎还没有实现这样的功能......

      【讨论】:

        【解决方案4】:

        ClassLoader 将在没有更多由 ClassLoader 创建的类实例后进行垃圾回收。有一个旧错误 (4950148) 与无法显式处置 ClassLoader 相关,这会导致文件锁定等问题。

        现在是 fixed in JDK 7,它添加了一个 URLClassLoader.close() 方法。

        【讨论】:

          【解决方案5】:

          只要这个类加载器加载的任何类被引用,类加载器就不会被垃圾回收。所以类加载器将在以下情况下被删除:对类加载器的所有直接引用都为空,对由该类加载器加载的类的所有引用以及对这些类的实例的所有引用。然后可以在垃圾收集器的下一次运行时将其转储。

          【讨论】:

            猜你喜欢
            • 2014-10-24
            • 1970-01-01
            • 2018-08-13
            • 2012-09-06
            • 1970-01-01
            • 2016-07-25
            • 1970-01-01
            • 2014-11-22
            相关资源
            最近更新 更多