[英]Java OutOfMemory Heap Space
大家。 我正在做一個項目。 一路上,我得到了這行代碼的“OutOfMemory”問題......
this.A = new int[n][n];
......對於n = 10000;
我嘗試通過添加-Xmx2048m
命令來修復它,但事情是在添加時,所有其余正在運行的程序都停止響應。 對我的案子還有其他建議嗎? 非常感謝
您必須計算數組所需的空間。 如果它超過2048M,那么你將收到一個OutOfMemoryError
。
在您的情況下,您嘗試分配10000 x 10000
的數組,即100.000.000
。
原始int
占用4
個字節。 這意味着整個數組都需要
100.000.000 * 4
字節,即0,37 GB
的空間。
因此,您的程序中似乎還有其他事項可以預測錯誤。 例如,如果您嘗試在循環中分配多個數組,那么您可以快速耗盡內存。
如果您的硬件沒有2048M
的內存,則可能會出現問題。
在使用-Xmx2048m
之前,您可能還有例如-Xmx512m
,這可能對您的陣列來說太小了。
用這個:
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
java -Xms16m -Xmx64m ClassName
讓我們來看看...
int
在內存中占用32位或4個字節。
因此,您的二維數組需要10000 * 10000 * 4字節= 400000000字節= 381.47 MB (加上數組對象的存儲空間)
讓我們通過一個簡單的測試驗證:
int n = 10000;
int[][] foo = new int[n][n];
System.out.println("USED MEMORY: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024 / 1024);
結果:384 MB(在我的機器上,您的結果可能會有所不同)。
當請求的內存塊無法分配時,堆中的內存不足, 而不一定是在內存已滿時 。
當您以40'000字節的塊分配內存時,如果沒有可用的連續空閑內存 ,則可能會耗盡內存(數百個小於40'000的塊在此處無效)。 這意味着當堆上的可用內存碎片為小內存塊時,您可以輕松耗盡內存 。
如果您碰巧連續多次分配該內存,請嘗試重用已分配的內存而不是再次分配(以防止碎片到一定程度)。 或者,嘗試使用較小的數組(即使它意味着使用更多的數組)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.