簡體   English   中英

資源泄漏導致內存不足java堆空間問題

[英]out of memory java heap space issue because of resource leak

我正在使用以下代碼讀取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堆空間問題仍然存在。

我什至將文件更改為普通文本文件,並僅向該文件添加了一個示例行,但是問題仍然存在。

這不是任何內存泄漏,這是無限循環。 您不會在while循環中更新line ,因此它永遠不會為null。 它將一直循環直到您用盡內存。

您需要將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
}

還要注意,如果您的輸入可能很大,則可能需要順序處理它,而不是全部存儲在字符串中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM