簡體   English   中英

Java OutOfMemoryError:奇怪的行為

[英]Java OutOfMemoryError: Strange behavior

下面的程序 (prog1) 拋出 OutOfMemoryError 錯誤。 沒錯。 但是如果我在第 5 行(prog2)下面添加 sysout,它就不會拋出錯誤。 這種奇怪行為的任何原因?

程序1:

public static void main(String[] args) {
    List<String> myList = new ArrayList<>();     
    try {
        while (true) {
            myList.add("My String"); //5
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

程序2:

public static void main(String[] args) {
    List<String> myList = new ArrayList<>();        
    try {
        while (true) {
            myList.add("My String");
            System.out.println(myList);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

第二個版本最終也會耗盡內存。 (如果你不覺得無聊,先殺了它。)

問題是打印語句重復打印越來越長的列表。

當您在第二個版本中將 N 項添加到列表中時,您將打印出大小為1 + 2 + 3 + ... + N 那是字符串"My String" N * (N + 1) / 2副本……等等。 那是O(N^2)

如果您將其寫入/dev/null將需要很長時間。 如果將其寫入文件,則更長。 如果你把它寫到顯示在屏幕上的控制台......幾個小時后回來。


作為實驗,替換

    System.out.println(myList);

    System.out.print("X");

現在你將只打印O(N)字符而不是O(N^2) ......並且 OOME 會更快發生。

暫無
暫無

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

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