Java 如何测试依赖软引用的代码?
我有一些代码使用了Java 如何测试依赖软引用的代码?,java,unit-testing,garbage-collection,Java,Unit Testing,Garbage Collection,我有一些代码使用了SoftReference子类的许多实例。我想测试一下,在ReferenceQueue中所有/只有部分/没有这些引用被暂存以清除的情况下,它是否能正常工作。对于“none”的情况,这很容易:创建对对象的强引用,并且保证软引用保持不变。然而,我将如何保证他们被清除?据我所知,System.gc()只是运行垃圾收集器的请求,即使它实际运行,它也可能决定不收集所有无法访问的对象 此外,代码的性能非常关键,因此仅仅为了测试目的而修改代码不是一个好主意。(添加不影响其他方法的仅测试方法是
SoftReference
子类的许多实例。我想测试一下,在ReferenceQueue
中所有/只有部分/没有这些引用被暂存以清除的情况下,它是否能正常工作。对于“none”的情况,这很容易:创建对对象的强引用,并且保证软引用保持不变。然而,我将如何保证他们被清除?据我所知,System.gc()
只是运行垃圾收集器的请求,即使它实际运行,它也可能决定不收集所有无法访问的对象
此外,代码的性能非常关键,因此仅仅为了测试目的而修改代码不是一个好主意。(添加不影响其他方法的仅测试方法是可以的,但添加仅用于在其他方法中测试的路径是需要避免的).如果可以从测试中访问
SoftReference
实例,则可以通过直接调用SoftReference
实例上的方法来模拟GC行为
调用SoftReference.clear()
将对应于清除引用的第一步。然后,您可以调用SoftReference.enqueue()
将其排入引用队列,对应于GC在清除引用后[一段时间]执行的请求步骤
在SoftReferences
的子集上调用这些方法,可以模拟只有部分引用被清除并排队
我真的认为上面的方法是推荐的,因为您可以控制哪些引用被清除,这在测试中是一件好事
但是,如果您不能直接访问
软引用
,那么您就只能分配内存,试图让GC清除它们。例如,如问题及其答案中所示。我建议模拟软参考class@talex他们想实际测试软参考
。嘲弄它会有什么帮助?对不起,我错过了这个问题。现在我有另一个问题:为什么?听起来不错,我不知道你可以手动将引用排队。正如我所说的,只要“正常”代码不受影响,就可以将仅测试代码添加到所讨论的类中,我猜添加类似于enqueueReferencesTo(Set…
的内容就可以了。