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

标签 java unit-testing garbage-collection

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

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

最佳答案

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

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

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

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

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

关于java - 如何测试依赖于 SoftReference 的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056045/

相关文章:

php - Codeception 中的 Cest 格式的 @dataProvider

java - 减少垃圾收集中的暂停

java - 垃圾收集载入画面

java - 将 JavaPairDStream<String, Integer> 转换为 JavaPairDStream<Integer, String>,切换元组中的值 (Java Spark)

java - Quartz JobExecutionContext setResult 与 put

java - 在Java中,如何创建一个像KeyListener这样的类,如果你扩展它,它会自动调用方法?

java - 如何单击图像按钮并将其显示在 Android Studio 的新页面中?

java - 是否可以使用 junit 和 mockito 创建嵌套单元测试?

unit-testing - 单元测试失败时从 hudson 发送电子邮件

java - 本地引用变量是否添加到 GC