Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 资源泄漏测试_Java_Memory Leaks_Fileinputstream_Resource Leak - Fatal编程技术网

Java 资源泄漏测试

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

我试图理解不在任何流上调用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");
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
int loopCount=1000000;
for(int i=0;i
我用VisialVM监控这个程序。我可以看到GC正常运行。没有预期的mem泄漏

但是然后我想至少我应该看到一些例外,因为我基本上耗尽了java进程可用的文件描述符。为什么这里没有例外?程序一直在运行

另一个问题是,尽管我为创建的每个新文件都有一个FileInputStream,但如果我去尝试删除任何文件,操作系统端没有阻止我的锁定

有人能解释一下我的测试是否有效吗?
请解释在任何流上调用close失败时的资源泄漏。

大多数流都有一个
finalize()
方法,该方法将为您关闭它们,因此在该代码中,当变量在循环的每次迭代期间落在范围之外时,流可以被GC’d并自动关闭


这并不意味着您在释放资源时不应该小心谨慎。这只是一种安全措施。

试着避免所有引用被GC'd(例如:将它们添加到
ArrayList
中,然后查看性能是否发生变化。