我正在使用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中,我在类main
中使用以下参数运行A
:
-Xms5g -Xmx10g
我有numVertices
打印出一个大约30000的值,并且设置最小堆大小(-Xms
)似乎是不必要的。但是,我得到了:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
答案 0 :(得分:3)
运行以下内容:
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
或其他对象也可能正在使用堆空间。
答案 1 :(得分:1)
您似乎面临的情况是,堆内的任何区域(例如eden,survivor或old)都不足以容纳您尝试分配的数据结构。例如 - 您的5G堆默认情况下可以划分如下(请注意,这是特定于平台的):
通过调整不同区域的比率,更精细的配置将为您排序。