Java内存不足错误: Strange behavior

标签 java loops data-structures

下面的程序 (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();
    }
}

最佳答案

第二个版本最终也会耗尽内存。 (如果你不觉得无聊就先杀掉它。)

问题是 print 语句重复打印一个越来越长的列表。

当您在第二个版本中将 N 个项目添加到列表中时,您将打印尺寸列表 1 + 2 + 3 + ... + N。也就是说,N * (N + 1)/2 字符串 "My String" 的副本...以及更多。即O(N^2)

如果您将其写入/dev/null,则需要很长时间。如果将其写入文件,则更长。如果您将其写入屏幕上显示的控制台...几个小时后返回。

<小时/>

作为实验,替换

    System.out.println(myList);

    System.out.print("X");

现在您将只打印 O(N) 个字符,而不是 O(N^2) ...并且 OOME 会更快发生。

关于Java内存不足错误: Strange behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59985563/

相关文章:

java - 即使在我的 MAC 上安装了 JRE 8 -"No Java Runtime present,requesting to install "也会显示在终端中

java - eclipse magic : . .. 语法错误,可变参数仅在源级别为 1.5 或更高时可用

java - 使用泛型和 jpa EntityManager 方法

java - 在 BeanPostProcessor 实现中获取 bean 的注解

c# - 继续;用于跳过许多循环

java - 如何使用深度优先遍历从 jar 中获取类

Javascript,比较数组中的元素,如果为 true 则执行函数

php - 在 PHP 中循环 For(将 , 添加到数组中)

algorithm - 给定一个排序的整数数组,如何从中形成二叉搜索树?

c++ - 在树上应用 bfs 以找到两个顶点之间的最长路径