Java 资源泄漏测试
我试图理解不在任何流上调用close()如何影响系统的性能和功能。为了做到这一点,我创建了下面的测试类Java 资源泄漏测试,java,memory-leaks,fileinputstream,resource-leak,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-f
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");
}
}
publicstaticvoidmain(字符串[]args)引发异常{
int loopCount=1000000;
for(int i=0;i
我用VisialVM监控这个程序。我可以看到GC正常运行。没有预期的mem泄漏
但是然后我想至少我应该看到一些例外,因为我基本上耗尽了java进程可用的文件描述符。为什么这里没有例外?程序一直在运行
另一个问题是,尽管我为创建的每个新文件都有一个FileInputStream,但如果我去尝试删除任何文件,操作系统端没有阻止我的锁定
有人能解释一下我的测试是否有效吗?
请解释在任何流上调用close失败时的资源泄漏。大多数流都有一个
finalize()
方法,该方法将为您关闭它们,因此在该代码中,当变量在循环的每次迭代期间落在范围之外时,流可以被GC’d并自动关闭
这并不意味着您在释放资源时不应该小心谨慎。这只是一种安全措施。试着避免所有引用被GC'd(例如:将它们添加到
ArrayList
中,然后查看性能是否发生变化。