对于包含数百万条记录的循环 - java.lang.OutOfMemoryError:Java堆空间

时间:2014-12-18 11:58:52

标签: java stringbuilder

我收到OutOfMemoryError:以下代码的Java堆空间:

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 个答案:

答案 0 :(得分:1)

因为已经达到了堆空间的阈值,直到你将对象放在hashmap中(代码中的最后一行没有给出错误)。任何操作(不仅将长度设置为零,而是处理堆的任何其他操作)都将导致heapspace变为outOfMemory。

答案 1 :(得分:1)

增加java的堆空间。

添加-XmX 4096

如果您真的对堆空间使用感兴趣,可以运行位于JDK_HOME / bin目录中的jvisualvm。

答案 2 :(得分:0)

转到cmd(命令行,是的我假设你在windows上;))。

然后准确输入以下内容。

java -Xmx4096

输入

java
以找出您可以执行的所有其他操作。我希望这更清楚。