资源泄漏测试

Resource leak test

我试图了解不对任何流调用 close() 会如何影响系统的性能和功能。为此,我创建了以下测试 class.

public static void main(String[] args) throws Exception {

      int loopCount = 1000000;
      for (int i = 0; i < loopCount; i++) {

        PrintWriter writer = new PrintWriter("C:/files/the-file-name" + i +".txt", "UTF-8");
        writer.println("The first line");
        writer.println("The second line");
        writer.close();
        FileInputStream is = new FileInputStream("C:/files/the-file-name" + i +".txt");
    }
}

我正在使用 VisialVM 监视这个程序。我可以看到 GC 正常运行。没有像预期的那样泄漏内存。

但是 然后我想至少我应该看到一些异常,因为我基本上耗尽了可用的文件描述符 java过程。为什么这里也不例外?程序保持 运行!

另一个问题是,虽然我为每个创建的新文件都有一个 FileInputStream,但如果我去尝试删除任何文件,OS 端没有锁来阻止我。

谁能解释一下我的测试是否有效? 并请解释在无法调用任何流上关闭的情况下的资源泄漏。

大多数流都有一个 finalize() 方法可以为您关闭它们,因此在这段代码中,流可以被 GC 处理并在每次循环迭代期间变量超出范围时自动关闭.

这并不意味着您不应该小心释放资源。只是一个安全。