4

要使任何代码SoftReference<T>都经过全面测试,必须想出某种方法来测试“是的,它已被取消”的情况。人们可能或多或少地通过使用“测试”代码路径来强制引用为空来模拟这一点,但这不会像 GC 那样管理队列。我想知道是否有人可以分享建立一个可重复的、受控的环境的经验,实际上,在这个环境中,GC 被激发为收集和归零?

4

2 回答 2

3

我会将问题分为两部分:

  1. 返回 null 时测试代码路径。
  2. 测试软引用。

对于#1,我将使用返回具有足够变化的 null 的 Mock(有时为 null,有时为真实对象)来测试您认为使用 GC 将遇到的所有相关场景。那将是单元测试。

接下来是真正的集成测试,看看GC的行为WRT SoftReference是否如你所愿。我不确定我是否会努力完全自动化这样的测试,除非在更大的负载测试环境中,但如果这很重要,我会启动一个最大内存量非常紧张的 JVM 并加载足够的内存来触发软引用收集。失败的路径是让代码不使用软引用,加载的内存应该会导致 OutOfMemory 错误。然后通过转换为软引用使测试通过。测试的目的应该是断言在单元测试中对行为所做的假设。

于 2010-05-11T20:16:47.680 回答
3

这个答案解释了如何强制使用“完整内存”进行垃圾收集。只是试图分配比你拥有的更多的东西,这将失败,但直到所有SoftReference东西都被清理干净。

于 2011-11-09T08:59:40.657 回答