gpt4 book ai didi

java - 为什么在此单元测试中未调用 finalize 函数?

转载 作者:行者123 更新时间:2023-11-29 03:49:11 26 4
gpt4 key购买 nike

我正在尝试编写一个 Java 单元测试来测试调用终结器对对象的影响。

为了确保调用终结器,我使用了我在 stackoverflow 的其他地方看到的 WeakReference 方法。

我的问题是,在此测试中,即使 WeakReference 在一次迭代后变为 null,也永远不会调用 TestFinalizer 的 finalize 方法:

public class FinalizerTest {    
private static class TestFinalizer {
public static class Callback {
public int NumFinalize = 0;

public void finalized(){
NumFinalize++;
}
}
private Callback callback;

public TestFinalizer(Callback callback){
this.callback = callback;
}

@Override
public void finalize() throws Throwable {
callback.finalized();
super.finalize();
}
}

@Test
public void testForceFinalizer(){
TestFinalizer.Callback callback = new TestFinalizer.Callback();
TestFinalizer testFinalizer = new TestFinalizer(callback);
// Try to force finalizer to be called
WeakReference<Object> ref = new WeakReference<Object>(testFinalizer);
testFinalizer = null;
int maxTries = 10000, i=0;
while (ref.get() != null && i<maxTries) {
++i;
System.gc();
}
if ( ref.get() != null )
fail("testFinalizer didn't get cleaned up within maxTries");

// Last line passes, next fails!
assertEquals("Should be exactly one call to finalizer", 1, callback.NumFinalize);
}
}

最佳答案

您对 System.gc 的调用只是一个建议,而不是命令。

没有明确保证会调用任何终结器。

在您的情况下,可能会在 VM 退出时调用终结器。

关于java - 为什么在此单元测试中未调用 finalize 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9540114/

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