资源泄漏测试

时间:2017-01-30 17:57:02

标签: java memory-leaks fileinputstream resource-leak

我试图了解如何在任何流上调用close()都不会影响系统的性能和功能。为了做到这一点,我创建了下面的测试类。

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,如果我去尝试删除任何文件,操作系统端就没有锁定来阻止我。

有人可以解释我的测试是否有效吗? 如果在任何流上无法调用关闭,请解释资源泄漏。

1 个答案:

答案 0 :(得分:2)

大多数流都有一个finalize()方法,它会为你关闭它们,所以在这段代码中,流可以是GC并且在循环的每次迭代期间变量超出范围时自动关闭

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