1

我无法理解这两个代码之间的区别;

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    while (true) {
      list.add("Hello");
    }
  }

java.lang.OutOfMemoryError 在一秒钟内抛出,

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    while (true) {
      list.add("Hello");
      System.out.println(list.size());  // Simply display the size of List
    }
  }

java.lang.OutOfMemoryError 5 分钟后抛出list.size() 值为 20767725。

4

4 回答 4

8

简而言之 - 显示 2000 万行文本需要相当长的时间。

很容易证明这一点。运行此代码:

for (int x = 0; x < 20767725; x++) {
    System.out.println(x);
}

我怀疑这也需要大约 5 分钟。

于 2013-10-17T06:53:21.830 回答
3

它的行为符合预期。在第一个代码中,系统不必等待通信来监控(即外部设备)。唯一的通信是在 RAM 和处理器之间进行,每秒进行数十亿次计算。所以内存很快就用完了。

在第二个代码中:在每个 addtolist 之后,该项目必须显示在控制台上。接口的输出操作比 CPU 到 RAM 的交互要慢得多。因此,该过程会暂停,直到显示“Hello”,然后再次继续,从而花费大量时间。

于 2013-10-17T06:57:22.100 回答
1

System.out.println()是一个需要一些时间的 IO 操作。这就解释了“一秒钟”和“5 分钟”之间的区别。

于 2013-10-17T06:54:49.620 回答
1

System.out.println()需要很多时间来执行,因为它与 IO 操作有关。

于 2013-10-17T07:16:36.637 回答