java.lang.OutOfMemoryError:Java堆空间

Was*_*RAR 1 java heap collections list 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);
        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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我试着看看为Double.MAX_VALUE做多长时间.我得到了这个:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.ensureCapacity(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

我有办法解决这个问题吗?

Ern*_*ill 17

有没有办法让你Double.MAX_VALUE在一个Collection?创建和存储对象?没有.地球上没有那么多RAM.Double.MAX_VALUE大约是第308次幂的2倍,即2次,然后超过300次零.给Best Buy一个电话,看看他们在你的电脑上收取多少费用.

  • @OpenMind:解决方案不是尝试不可能的事情. (8认同)
  • 没有解决方案.你不能存储那么多! (2认同)

Dil*_*nga 5

即使你有足够的记忆,ArrayList也可以拥有最多的Integer.MAX_VALUE元素.Double.MAX_VALUE远远超过了上限.

在这种情况下,在add导致阵列列表增长的情况下,内存不足.


Mic*_*rdt 5

您的代码无法工作的另一个原因:double只能表示大约2 ^ 52的整数 - 之后,i++将无效并且for循环永远不会终止.

永远不要将浮点变量用作循环计数器.使用intlong代替.