资源泄漏测试
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 处理并在每次循环迭代期间变量超出范围时自动关闭.
这并不意味着您不应该小心释放资源。只是一个安全。
我试图了解不对任何流调用 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 处理并在每次循环迭代期间变量超出范围时自动关闭.
这并不意味着您不应该小心释放资源。只是一个安全。