java - 资源泄漏测试

标签 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-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进程的可用文件描述符。为什么这里没有异常(exception)呢?程序继续运行!

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

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

最佳答案

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

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

关于java - 资源泄漏测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942415/

相关文章:

JavaMelody 阻碍 Spring Boot 测试

java - 有什么办法可以代替动态方法吗?

c++ - 使用 new 创建构造函数抛出的对象时,是否会泄漏构造的对象?

c# - WPF:ObservableCollection 内存泄漏

java - Android:如何访问使用 FileOutputStream 存储的对象

java - Spring-retry(Spring Boot)中如何配置延迟时间

java - 在 Hadoop 中并行化 Ruby reducer?

.net - 如果 .NET SqlConnection 对象未关闭,它会导致内存泄漏吗?

java - 使用 HttpURLConnection 从 url 下载文件 |如果文件名包含空格,则为 HTTP 400

java - 通过rest和html作为客户端上传文件