[英]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.