gpt4 book ai didi

java - 测试弱引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:29 27 4
gpt4 key购买 nike

在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com