如何检查OSGi包中的类是否已正确卸载?

时间:2015-08-13 12:18:37

标签: java garbage-collection osgi classloader

我有一个应用程序,我怀疑它会泄漏一些类引用。

为了暴露这种错误行为,我们编写了一个测试:BundleUnloadIT

在该测试中,我使用

    Assertions.assertThat(weakReference.isEnqueued())
        .as("weak reference should have been enqueued, but is not").isTrue();

测试我的引用是否正确gc'ed。 但无论我尝试做什么,参考都从未入队。 所以我怀疑某个类在某个地方泄漏了。

所以...我使用正确的方法来测试我的班级是否被卸载?

如果没有,我该如何正确地进行测试?

如果是的话,有一个参考泄露到某处。我该怎么找到它?

1 个答案:

答案 0 :(得分:0)

如果没有强引用类的类加载器(也就是类的类加载器也可以被垃圾收集),则只能卸载(垃圾回收)类。如果没有强引用加载的所有类,则只能对类加载器进行垃圾回收。所以它是一个全有或全无的命题。每个类都有一个强大的类加载器引用,每个类加载器都有对它加载的所有类的强引用。因此,如果强烈引用类加载器加载的任何类,则无法对类进行垃圾回收。