循环遍历数百万条记录 - java.lang.OutOfMemoryError: Java堆空间不足

3
我遇到了以下代码导致的 Java 堆空间内存溢出错误(OutOfMemoryError: Java heap space):
StringBuilder obj= new StringBuilder("");
InputStream in = new FileInputStream(new File(file));
br = new BufferedReader(new InputStreamReader(in), 102400);
for (String line; (line= br.readLine()) != null;) {
    for (i = 0; i < 3; i++) {
        for (j = 1; j < 5; j++){ 
            obj.append(line.charAt(j)); 
        }
    }   
    hashMap.put(obj.toString(), someValue);
    obj.setLength(0);
}

但是,
StringBuilder obj= new StringBuilder("");
InputStream in = new FileInputStream(new File(file));
br = new BufferedReader(new InputStreamReader(in), 102400);
for (String line; (line= br.readLine()) != null;) {
    obj.setLength(0);
    for (i = 0; i < 3; i++) {
        for (j = 1; j < 5; j++){ 
            obj.append(line.charAt(j)); 
        }
    }   
    hashMap.put(obj.toString(), someValue);
}

解决了错误?在开头或结尾放置obj.setLength(0)有什么问题?

异常信息:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
3个回答

1
因为堆空间的阈值已经达到,直到您将对象放入哈希映射中(在您的代码中的最后一行,当它不会出错时)。任何操作(不仅仅是将长度设置为零,而是任何涉及堆的其他操作)都会导致堆空间变为OutOfMemory。

1
增加Java的堆空间。
添加-XmX 4096
如果您真的关心堆空间使用情况,可以在JDK_HOME/bin目录中运行jvisualvm。

0

打开命令提示符(cmd,是的,我假设你在使用Windows ;))。

Then type the following precisely.

java -Xmx4096

Type in

java
to find out all the other things you can do. I hope this is more clear.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接