[英]Java OutOfMemoryError even with Correct Structuring?
我正在使用Java中的2D int
數組,它是正方形,並且在行和列中可以有大約30000個元素,這意味着數組中有30000 ^ 2 * 4個字節,小於5GB(我還有更多超過5GB的內存可用)。
我的程序的基本結構是這樣的:
public class A {
public static void main(String[] args) {
Graph g = ...; // read from file
System.out.println(B.computeSomethingBig(g));
}
}
public class B {
public static computeSomethingBig(Graph g) {
int numVertices = g.numVertices();
System.out.println(numVertices); // ~30000 maximum
int[][] array = new int[numVertices][numVertices];
// ... other computations
}
}
現在,在Eclipse中,我使用以下參數在A
類中運行main
:
-Xms5g -Xmx10g
我有numVertices
打印出一個大約30000的值,並設置最小堆大小( -Xms
)似乎是不必要的。 但是,我得到:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
運行以下內容:
public class A {
public static void main(String[] args) {
int numVertices = 30000;
int[][] array = new int[numVertices][numVertices];
}
}
沒有任何參數,即java A
導致OOM錯誤。 運行java -Xms5g -Xmx10g A
有效。 我懷疑numVertices比你預期的要大。 為什么不在分配之前輸出它以確保。
還要考慮您的Graph
或應用程序中的其他對象也可能正在使用堆空間。
您似乎面臨的情況是堆內的任何區域(例如eden,survivor或old)都不足以容納您嘗試分配的數據結構。 例如 - 您的5G堆默認情況下可以划分如下(請注意,這是特定於平台的):
通過調整不同區域的比率,更細粒度的配置將為您排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.