2017-01-30 110 views
2

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

任何人都可以解释我的测试是否有效吗? 并请解释有关资源泄漏的情况,如果没有在任何流上调用close。

+3

尽量保留GC'd的所有引用(例如:将它们添加到'ArrayList'并查看您的性能是否发生变化。 – CollinD

回答

3

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

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