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

标签 java unit-testing finalizer finalize

我正在尝试编写一个 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/

相关文章:

c# - 对某些 Web 服务方法进行单元测试

unit-testing - 使用 vstest.console 和参数执行测试

python - Python3 变量名称的简单区别能否改变代码的运行方式?

c#终结器抛出异常?

java - Scala/java 反射 - `newInstance` 抛出 InstantiationException

java - 如何从同一台计算机捕获本地和外部IP?

java - 在java中使用array_agg序列化psql结果集

java -\t 与 Java 中的间距不一致

SQLCop 测试 tSQLt - 新

c# - 从不同线程读取 DependencyProperty