Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试依赖软引用的代码?_Java_Unit Testing_Garbage Collection - Fatal编程技术网

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…
的内容就可以了。