下面的程序 (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/