如何测试依赖于 SoftReference 的代码?

How to test code that relies on a SoftReference?

我的某些代码使用了 SoftReference 子类的许多实例。我想测试它在所有/只有一些/none 这些引用被暂存以在 ReferenceQueue 中清除的情况下是否正常工作。对于 "none" 的情况,这很简单:创建对对象的强引用,并保证保留软引用。但是,我将如何保证它们被清除?据我了解,System.gc() 只是对 运行 垃圾收集器的请求,即使它实际上 运行s,它也可能决定不收集所有无法访问的对象...

此外,代码对性能非常关键,因此仅出于测试目的而更改它并不是一个好主意。 (添加不影响其他方法的仅测试方法很好,但要避免添加仅用于其他方法测试的路径)。

如果可以选择从测试中访问您的 SoftReference 个实例,您可以通过直接在 SoftReference 个实例上调用方法来模拟 GC 行为。

调用SoftReference.clear() 对应于清除引用的第一步。然后你可以调用 SoftReference.enqueue() 将它排入引用队列,对应于 GC 在清除引用后[一段时间] 执行的入队步骤。

在您的 SoftReferences 子集上调用这些方法,您可以模拟只有一些引用已被清除并入队。

我真的认为上述方法值得推荐,因为您可以控制清除哪些引用,这在测试中是一件好事。

但是,如果您不能直接访问您的 SoftReferences,那么您只能通过分配内存来让 GC 清除它们。例如,如 this 问题及其答案所示。