簡體   English   中英

java.lang.OutOfMemoryError: Java 堆空間

[英]java.lang.OutOfMemoryError : Java heap space

我在玩 Oracle 網站上的 Collections 的一些例子

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));
    }
}

我試圖查看 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)

我有辦法解決這個問題嗎?

有沒有辦法讓您在Collection中創建和存儲Double.MAX_VALUE對象? 不,地球上沒有那么多 RAM。 Double.MAX_VALUE大約是 2 乘以 10 的 308 次方:即 2 后跟 300 多個零。 給百思買打個電話,看看他們要多少錢才能把它放進你的電腦。

即使你有足夠的 memory, ArrayList最多也可以有Integer.MAX_VALUE元素。 Double.MAX_VALUE遠遠超過上述限制。

在這種情況下,您在導致數組列表增長的add過程中用完了 memory。

您的代碼無法工作的另一個原因是: double只能表示精確到大約 2^52 的整數 - 之后, i++將不起作用, for循環將永遠不會終止。

你永遠不應該使用浮點變量作為循環計數器。 請改用intlong

而不是做你目前正在做的事情,你應該只獲得 10 個隨機雙打,將它們添加到 ArrayList 並對其進行排序。 這基本上就是你的方法正在做的事情。

要獲得隨機雙精度,請查看Random.nextDouble()

您正在嘗試分配 10^308 個值的順序。 這是很多價值觀。

增加堆的大小就可以了。 只需使用此參數運行程序:

-Xmx512m

它會將您的堆大小增加到 512 MB。 您可以根據需要指定任意數量:1g、2g 等等。

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));

如果有空間, ArrayList只會將值添加到ArrayList 如果不是,它將增加ArrayList的大小,然后繼續添加。

因此,當您創建此ArrayList 如果你讓你的ArrayList變小,你應該可以把它放在 memory 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM