繁体   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