Java OutofMemory链接列表添加错误

Java OutofMemory链接列表添加错误,java,out-of-memory,bufferedreader,filereader,linked-list,Java,Out Of Memory,Bufferedreader,Filereader,Linked List,我试图从一本txt文件书中读取内容,然后将其中的每一行添加到linkedlist中。然而,当我运行代码时,我在l.addline;上得到了一个outofmemory错误;。你能告诉我这个代码有什么问题吗?或者,有没有更好的方法来存储字符串值而不是LinkedList 非常感谢 public Book (String bookname) throws java.io.IOException{ f = new FileReader(bookname); b = new Buffere

我试图从一本txt文件书中读取内容,然后将其中的每一行添加到linkedlist中。然而,当我运行代码时,我在l.addline;上得到了一个outofmemory错误;。你能告诉我这个代码有什么问题吗?或者,有没有更好的方法来存储字符串值而不是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();
}

正如其他人指出的,您已经创建了一个无限的、消耗内存的循环。从BufferedReader读取的常见习惯用法是:

String line;
while ( ( line = b.readLine() ) != null) {
    l.add(line);
}
我想这本书的内容可能太大了,根本无法一次全部存入内存。您可以使用Xmx参数增加JVM可用的内存,即:

java -Xmx1G MyClass

默认值为64MB,这在现在已经不多了。

正如其他人所指出的,您已经创建了一个无限的、消耗内存的循环。从BufferedReader读取的常见习惯用法是:

String line;
while ( ( line = b.readLine() ) != null) {
    l.add(line);
}
我想这本书的内容可能太大了,根本无法一次全部存入内存。您可以使用Xmx参数增加JVM可用的内存,即:

java -Xmx1G MyClass

默认值为64 Mb,这在现在已经不多了。

很简单,在程序中存储字符串和其他内容所需的内存超过了堆上可用的总内存

其他列表的开销稍有不同,但实际上,与包含的数据相比,结构本身的内存需求可能微不足道。换言之,切换到不同的列表实现可能会让您在陷入困境之前多读几行,但这并不能解决问题

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

其中512m表示512兆字节的堆空间;您可以使用-Xmx2g或您认为合适的任何其他工具

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


另一方面,试图将大量输入作为一个批处理常常会遇到内存问题—如果您想处理8GB的文本文件,该怎么办?通常,最好以某种流的形式顺序处理较小的块。例如,如果您想将每个字符都大写,并将其写回另一个文件,您可以一次一行,而不是先将整本书读入内存。

非常简单,存储字符串和程序中其他所有内容所需的内存超过了堆上可用的总可用内存

其他列表的开销稍有不同,但实际上,与包含的数据相比,结构本身的内存需求可能微不足道。换言之,切换到不同的列表实现可能会让您在陷入困境之前多读几行,但这并不能解决问题

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

其中512m表示512兆字节的堆空间;您可以使用-Xmx2g或您认为合适的任何其他工具

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


另一方面,试图将大量输入作为一个批处理常常会遇到内存问题—如果您想处理8GB的文本文件,该怎么办?通常,最好以某种流的形式顺序处理较小的块。例如,如果您想将每个字符都大写,并将其写回另一个文件,您可以一次写一行,而不是先将整本书读入内存。

您要反复添加同一行,直到内存耗尽为止 t:


看到了吗?line变量在循环外部读取,并且在循环内部从不更改。

您正在反复添加同一行,直到内存耗尽:

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

看到了吗?line变量在循环外部读取,在循环内部从不更改。

而循环从不退出,因为变量 行从不为空。试试这个:

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

而循环从不退出,因为变量 行从不为空。试试这个:

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

也许你应该换一个

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


也许你应该换一个

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


我同意mjg123。小心那些超出记忆的期待。我请求你看看这个博客,了解更多关于如何处理这种情况的细节
我同意mjg123。小心那些超出记忆的期待。我请求你看看这个博客,了解更多关于如何处理这种情况的细节