我有某些代码使用SoftReference子类的许多实例。我想测试一下在全部/仅部分/全部这些引用都没有准备在ReferenceQueue中清除的情况下,它是否可以正常工作。对于“无”的情况,这很容易:创建对对象的强引用,并确保保留软引用。但是,我将如何保证将其清除?据我了解,System.gc()仅是运行垃圾收集器的请求,即使它实际上运行了,它也很可能决定不收集所有无法访问的对象...

另外,代码对性能至关重要,因此仅出于测试目的对其进行更改不是一个好主意。 (添加不影响其他方法的仅测试方法很好,但是可以避免添加仅用于其他方法中的测试的路径)。

最佳答案

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

调用SoftReference.clear()将对应于清除引用的第一步。然后,您可以调用SoftReference.enqueue()将其排队在参考队列中,这与GC在清除参考之后[一段时间]进行的排队步骤相对应。

SoftReferences的子集上调用这些方法,您可以模拟仅清除了某些引用并将它们排入队列。

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

但是,如果您无法直接访问SoftReferences,则您将只能使用分配内存来尝试使GC清除它们。例如,如this问题及其答案所示。

08-18 02:14