2017-09-26 50 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 
} 

还要注意的是,如果你的输入可能非常大,您可能需要对其进行处理,而不是按顺序存放所有字符串。