我试图了解如何在任何流上调用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,如果我去尝试删除任何文件,操作系统端就没有锁定来阻止我。
有人可以解释我的测试是否有效吗? 如果在任何流上无法调用关闭,请解释资源泄漏。
答案 0 :(得分:2)
大多数流都有一个finalize()
方法,它会为你关闭它们,所以在这段代码中,流可以是GC并且在循环的每次迭代期间变量超出范围时自动关闭
这并不意味着你不应该小心释放资源。这只是一种安全。