资源泄漏测试



我试图了解不在任何流上调用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,但如果我尝试删除任何文件,操作系统端没有锁来阻止我。

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

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

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

最新更新