在 Java 中测试弱引用的正确方法是什么?
我最初的想法是执行以下操作:
public class WeakReferenceTest {
public class Target{
private String value;
public Target(String value){
this.value = value;
}
public String toString(){
return value;
}
}
public class UsesWeakReference{
WeakReference<Target> reference;
public UsesWeakReference(Target test){
reference = new WeakReference<Target>(test);
}
public String call(){
Target test = reference.get();
if(test != null){
return test.toString();
}
return "empty";
}
}
@Test
public void testWeakReference(){
Target target = new Target("42");
UsesWeakReference usesWeakReference = new UsesWeakReference(target);
WeakReference<Target> triggerReference = new WeakReference<Target>(target);
assertEquals("42", usesWeakReference.call());
target = null;
while(triggerReference.get() != null){
System.gc();
}
assertEquals("empty", usesWeakReference.call());
}
}
我对该方法的保留意见是使用 System.gc(),因为我知道它在不同的 JVM 上的行为可能不同。
最佳答案
没有 100% 防弹的方法来测试使用引用类型的代码。 Reference 对象的行为取决于 GC 何时运行,并且没有 100% 可靠的方法强制 GC 运行。
你能做的最好的事情是:
- 检查您在运行测试时是否设置了正确的 JVM 选项,以及
- 编写您的测试,使其在
System.gc()
是空操作的情况下不会失败或愿意禁用或跳过测试, 或者忽略测试失败。
(您应该能够通过查看调用前后使用了多少内存来检测 System.gc()
是否被忽略;例如,通过调用 Runtime.totalMemory ()
)
其实还有另一种“解决办法”。让你的单元测试产生大量垃圾……足以保证你会触发垃圾收集。 (这不是个好主意,IMO。)
关于java - 测试弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11174328/