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

How to check if a class in an OSGi bundle has been correctly unloaded?

我怀疑我有一个应用程序泄露了一些 class 引用。

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

在那个测试中,我使用

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

测试我的引用是否正确 gc 了。 但无论我尝试做什么,引用都不会排队。 所以我怀疑对 class 的一些引用在某处泄露了。

所以...我是否使用正确的方法来测试我的 class 是否已卸载?

如果没有,我怎样才能正确地进行该测试?

如果是,则某处泄露了引用。我怎样才能找到它?

一个class只有在class'class加载器没有被强引用(即class'class loader 也可以被垃圾回收)。一个 class 加载器只有在它加载的所有 classes 都没有被强引用时才能被垃圾回收。所以这是一个全有或全无的命题。每个 class 都有一个对其 class 加载器的强引用,每个 class 加载器都有对其加载的所有 classes 的强引用。因此,如果 class 加载程序加载的任何 class 被强引用,则 class 不可能被垃圾回收。