由于资源泄漏导致内存不足 java 堆 space 问题
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)
后来才发现buffered有资源泄漏的警告reader
所以我添加了代码 br1.close();
并解决了警告。但是java堆space的issue卡住了
我什至将我的文件更改为普通文本文件,并只向文件中添加了一个示例行,但问题仍然存在。
这不是任何内存泄漏,这是无限循环。您不会在 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
}
另请注意,如果您的输入可能非常大,您可能需要按顺序处理它,而不是将其全部存储在一个字符串中。
我正在使用以下代码读取 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)
后来才发现buffered有资源泄漏的警告reader
所以我添加了代码 br1.close();
并解决了警告。但是java堆space的issue卡住了
我什至将我的文件更改为普通文本文件,并只向文件中添加了一个示例行,但问题仍然存在。
这不是任何内存泄漏,这是无限循环。您不会在 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
}
另请注意,如果您的输入可能非常大,您可能需要按顺序处理它,而不是将其全部存储在一个字符串中。