我试图了解不对任何流调用 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进程的可用文件描述符。为什么这里没有异常(exception)呢?程序继续运行!
另一个问题是,虽然我为每个创建的新文件都有一个 FileInputStream,但如果我尝试删除任何文件,操作系统端没有锁来阻止我。
谁能解释一下我的测试是否有效? 请解释一下在任何流上调用 close 失败时的资源泄漏。
最佳答案
大多数流都有一个 finalize()
方法,可以为您关闭它们,因此在这段代码中,当变量在每次迭代期间超出范围时,流可以被 GC 并自动关闭循环的。
这并不意味着您在释放资源时不应该小心。这只是一种安全。
关于java - 资源泄漏测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942415/