簡體   English   中英

內存不足LinkedList添加錯誤

[英]OutofMemory LinkedList Adding Error

我正在嘗試從txt文件(書)中讀取內容,然后將其每一行添加到鏈表中。 但是,當我運行代碼時,在l.add(line);處出現l.add(line);不足錯誤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();
}

正如其他人指出的那樣,您已經創建了一個無限的,消耗內存的循環。 從BufferedReader讀取的常見用法是:

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

我想這本書的內容可能太大而無法一次全部放入內存。 您可以使用Xmx參數來增加JVM可用的內存,即:

java -Xmx1G MyClass

默認值是64 Mb,這些天來已經不多了。

您要一遍又一遍地添加同一行,直到內存用完:

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

看到? -variable 行在循環外部讀取,在循環內永不更改。

可能您應該更換

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

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

while循環永遠不會退出,因為可變line永遠不會為空。 嘗試這個:

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

很簡單,存儲字符串(以及程序中的所有其他內容)所需的內存超過了堆上可用的總可用內存。

其他列表的開銷將略有不同,但是實際上,結構本身的內存要求與其所包含的數據相比可能微不足道。 換句話說,切換到其他列表實現可能會讓您在翻倒前多讀幾行,但不能解決問題。

如果您沒有增加Java應用程序的堆空間,那么它可能會以較低的默認值運行。 在這種情況下,您應該考慮在調用java提供以下命令行參數:

-Xmx512m

512m意味着512 MB的堆空間;您可以使用-Xmx2g或其他您認為合適的方法。)

另一方面,如果您已經運行了一個大堆(比要保留在內存中的String的總大小大得多),這可能表明其他地方存在內存問題。 書中有幾個字符? 存儲所有行至少需要兩倍的字節數,並且可能要多出20%左右才能解決開銷。 如果您的計算表明您當前的堆空間應該能夠容納所有這些數據,那么其他地方可能會遇到麻煩。 否則,您現在知道將堆增加到最低限度需要什么。

(順便說一句,嘗試作為一個批處理大量輸入通常會遇到內存問題-如果要處理8GB文本文件該怎么辦?通常最好以某種流順序處理較小的塊。對於例如,如果您要大寫每個字符並將其寫回到另一個文件中,則可以一次執行一行操作,而不是先將整本書讀入內存中。)

我同意mjg123。 並注意內存不足的期望。 我要求您必須查看此博客以獲取有關如何處理此類情況的更多詳細信息,請單擊此處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM