java.lang.OutOfMemoryError:java堆空间
我在玩Oracle网站上的一些收藏示例java.lang.OutOfMemoryError:java堆空间,java,list,collections,heap,out-of-memory,Java,List,Collections,Heap,Out Of Memory,我在玩Oracle网站上的一些收藏示例 public class Timing { public static void method(){ List numbers = new ArrayList(); for (double i = 1; i <= Double.MAX_VALUE; i++) numbers.add(new Double(i)); Collections.shuffle(numbers);
public class Timing {
public static void method(){
List numbers = new ArrayList();
for (double i = 1; i <= Double.MAX_VALUE; i++)
numbers.add(new Double(i));
Collections.shuffle(numbers);
List winningcombination = numbers.subList(0, 10);
Collections.sort(winningcombination);
}
public static void main(String[] args)
{
long start = System.currentTimeMillis();
method();
long end = System.currentTimeMillis();
System.out.println("time elapsed : " + (end-start));
}
}
我有办法解决这个问题吗?即使你有足够的内存,
ArrayList
最多只能有Integer.MAX\u VALUE
元素<代码>双倍。最大值远远超过上述限制
在这种情况下,在导致数组列表增长的
添加过程中内存不足。即使内存足够,数组列表
最多可以包含整数.MAX\u值
元素<代码>双倍。最大值
远远超过上述限制
在这种情况下,在导致数组列表增长的
添加过程中内存不足。是否有方法允许您在集合中创建和存储Double.MAX_VALUE
对象?不,地球上没有那么多公羊<代码>双精度。最大值约为308次方的2倍10:即2后跟300多个零。给百思买打个电话,看看他们把它放在你的电脑里要收多少钱。有没有办法让你在集合中创建和存储Double.MAX\u VALUE
对象?不,地球上没有那么多公羊<代码>双精度。最大值约为308次方的2倍10:即2后跟300多个零。给百思买打个电话,看看他们会向你的电脑收取多少费用。增加堆的大小就可以了。只需使用以下参数运行程序:
-Xmx512m
它会将堆大小增加到512 MB。您可以指定任意数量:1g、2g等等。增加堆的大小就可以了。只需使用以下参数运行程序:
-Xmx512m
它会将堆大小增加到512 MB。您可以指定任意数量的值:1g、2g等等。您正在尝试分配10^308个值的顺序。这是很多价值观 您正在尝试分配10^308个值的顺序。这是很多价值观 for(双i=1;ifor(双i=1;i在您的循环中:
for (double i = 1; i <= Integer.MAX_VALUE; i++)
numbers.add(new Double(i));
for (double i = 1; i <= Double.MAX_VALUE; i++)
numbers.add(new Double(i));
for(双i=1;i在您的循环中:
for (double i = 1; i <= Double.MAX_VALUE; i++)
numbers.add(new Double(i));
for(double i=1;i您的代码无法工作的另一个原因:double
只能精确地表示大约2^52的整数-此后,i++
将无效,for
循环将永远不会终止
千万不要将浮点变量用作循环计数器。请改用int
或long
。代码无法工作的另一个原因是:double
只能精确地表示大约2^52的整数-此后,i++
将无效,而for
循环将永远不会终止
千万不要将浮点变量用作循环计数器。请改用int
或long
。不要执行当前正在执行的操作,只需获得10个随机双精度,将它们添加到ArrayList并对其排序。这基本上就是您的方法所执行的操作
要获得一个随机双精度,请查看。与当前所做的操作不同,您只需获得10个随机双精度,将它们添加到ArrayList中并对其进行排序。这基本上就是您的方法所做的
要获得随机双精度,请查看。超出“多少?”(我只想看到一个大数字^^)超过“多少?”(我只想看到一个大数字^^)@OpenMind:解决方案不是尝试不可能的事情。没有解决方案。你不能存储那么多!解决方案是对循环使用一个更小的上限,比如说,不超过一百万。@OpenMind,你到底想做什么?生成10个保证没有重复的随机数?如果是,请查看伪random数字生成器。此外,我不明白为什么您要生成双打而不是长或字母数字等的赢组合。请编写一个更好的算法,只存储已选择的数字,如果您得到了相同的数字,但您没有足够的数量,则再次随机进行。@OpenMind:解决方案不是尝试不可能的事情。没有解决方案。你不能存储那么多!解决方案是对你的循环使用一个小得多的上限——比如说,不超过一百万左右。@OpenMind,你到底想做什么?生成10个保证没有重复的随机数?如果是的话,请查看伪随机数生成器。另外,我不明白你为什么这样做用双数而不是长数或字母数字等组合获胜。写一个更好的算法,只需存储已经选择的数字,如果你有相同的数字,并且没有足够的数字,再进行一次随机。放在一个真实的角度?10^308
看起来很小;p@pst 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;p@pst100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000s解决OutOfMemory
异常?(PC仍然无法接近。)这样更好,尽管你可能仍然没有那么多内存。这大约是20亿个对象,每个对象至少12字节,加上数组列表中的数组;因此对象为24GB,数组为8B。@Ernest:嗯,消费级PC拥有24GB内存并非完全不可能;事实上,5年后可能会很正常。事实上,这就是为什么我说“你可能还没有那么多”。我有一个服务器