2017-09-26 61 views
0

我使用下面的代碼並獲得Java的內存不足的錯誤讀取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堆空間的問題仍然存在。

我甚至將我的文件更改爲普通文本文件,並向該文件添加了一行樣本,但問題仍然存在。

+0

可能的重複https://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap-space-error-64mb-heap – Lokesh

+0

不,對於上述問題文件的大小是巨大的。但在我的情況下,我甚至現在用2行文件嘗試。它只是讀取第一行並拋出此錯誤 –

+0

你檢查了Jiri的答案? – Lokesh

回答

3

這不是任何內存泄漏,這是無限循環。您不更新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 
} 

還要注意的是,如果你的輸入可能非常大,您可能需要對其進行處理,而不是按順序存放所有字符串。