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