簡體   English   中英

Java OutOfMemory堆空間

[英]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 ,這可能對您的陣列來說太小了。

用這個:

增加Java中的堆大小

-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.

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