【问题标题】:out of memory java heap space issue because of resource leak由于资源泄漏导致内存不足的 Java 堆空间问题
【发布时间】:2018-03-07 14:00:30
【问题描述】:

我正在使用以下代码读取 JSON 文件,并出现 java 内存不足错误:

BufferedReader br1 = new BufferedReader(new FileReader(filename));
try {
StringBuilder sb = new StringBuilder();
String line = br1.readLine();
while (line != null) {
  sb.append(line);
  }
result = sb.toString();
} catch (Exception e) {
  e.printStackTrace();
}

我得到以下错误:

java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3332)
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
        at java.lang.StringBuilder.append(StringBuilder.java:136)

后来我意识到有缓冲阅读器资源泄漏的警告 所以我添加了代码br1.close(); 并解决了警告。但是java堆空间的问题就卡住了。

我什至将我的文件更改为普通文本文件,并且只在文件中添加了一个示例行,但问题仍然存在。

【问题讨论】:

  • 不,对于上述问题,文件大小很大。但就我而言,我什至现在尝试使用 2 行文件。它只是读取第一行并抛出此错误
  • 你检查Jiri的答案了吗?

标签: java file memory-leaks out-of-memory heap-memory


【解决方案1】:

这不是任何内存泄漏,这是无限循环。您没有在while 循环中更新line,因此它永远不会为空。它会一直循环,直到你的内存用完。

您需要将line = br1.readLine() 放入循环中:

try (BufferedReader br1 = new BufferedReader(new FileReader(filename))) {
    StringBuilder sb = new StringBuilder();
    String line = br1.readLine();
    while (line != null) {
        sb.append(line);
        line = br1.readLine();
    }
    result = sb.toString();
} catch (IOException | RuntimeException e) {
    // TODO proper exception handling
}

另请注意,如果您的输入可能非常大,您可能需要按顺序处理它,而不是将其全部存储在字符串中。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2018-07-15
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多