OutofMemory LinkedList添加错误

时间:2011-03-04 11:49:46

标签: java out-of-memory bufferedreader filereader linked-list

我正在尝试从txt文件(书籍)中读取,然后将其每一行添加到链接列表中。但是,当我运行代码时,我在l.add(line);处出现了一个内存错误。你能告诉我这段代码我做错了什么吗?或者,有没有更好的方法来存储String值而不是LinkedList?

非常感谢!

public Book (String bookname) throws java.io.IOException{
    f = new FileReader(bookname);
    b = new BufferedReader(f);
    l = new LinkedList<String>();
    String line = b.readLine();
    while (line != null) {
        l.add(line);
    }
    b.close();
}

6 个答案:

答案 0 :(得分:6)

正如其他人指出的那样,你创造了一个无限的,耗费内存的循环。从BufferedReader读取的常用习惯是:

String line;
while ( ( line = b.readLine() ) != null) {
    l.add(line);
}

我想这本书的内容可能太大了,无论如何都不能同时适应内存。您可以使用Xmx参数增加JVM可用的内存,即:

java -Xmx1G MyClass

这个默认值是64 Mb,这些日子并不多。

答案 1 :(得分:2)

你一遍又一遍地添加同一行,直到内存耗尽:

String line = b.readLine();
while (line != null) {
    l.add(line);
}

请参阅? -variable在循环外部读取,并且永远不会在循环内发生变化。

答案 2 :(得分:2)

可能你应该替换

while (line != null) {
    l.add(line);
}

while (line = b.readLine()) {
    l.add(line);
}

答案 3 :(得分:1)

while循环永不退出,因为变量 line永远不会为空。试试这个:

String line = "";
while ((line = b.readLine())!= null)
{
   l.add(line);
}
b.close();

答案 4 :(得分:0)

很简单,存储字符串(以及程序中的其他所有内容)所需的内存超过了堆上可用的总可用内存。

其他列表的开销量略有不同,但实际上,与其包含的数据相比,结构本身的内存需求可能微不足道。换句话说,切换到不同的列表实现可能会让你在翻倒之前再读几行,但它无法解决问题。

如果你没有增加java应用程序的堆空间,它可能会以相当低的默认值运行。在这种情况下,您应该考虑为调用java

提供以下命令行参数
-Xmx512m

(其中512m意味着512 MB的堆空间;您可以使用例如-Xmx2g或其他您认为合适的其他内容。)

另一方面,如果你已经运行了一个大堆(远大于你想要在内存中保存的字符串的总大小),这可能会指向其他地方的内存问题。书中有多少个字符?它将至少两倍多的字节来存储所有行,并且可能比计算开销的20%左右更多。如果您的计算表明您当前的堆空间应该能够容纳所有这些数据,那么其他地方可能会有一些问题。否则,您现在知道需要将堆增加到最低限度。

(顺便说一下,尝试以单个批处理方式处理大量输入通常会遇到内存问题 - 如果要处理8GB文本文件会怎样?通常情况下,按顺序处理较小的块会更好例如,如果你想将每个字符大写并将其写回另一个文件,你可以一次一行,而不是先将整本书读入内存。)

答案 5 :(得分:0)

我同意mjg123。并且要小心内存的预期。我要求你必须查看这个博客,了解如何处理这种情况的更多细节 Click here