[英]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
循環將永遠不會終止。
你永遠不應該使用浮點變量作為循環計數器。 請改用int
或long
。
而不是做你目前正在做的事情,你應該只獲得 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.