Java OutOfMemoryError即使使用正确的结构化?

时间:2014-08-22 03:18:42

标签: java eclipse out-of-memory heap-memory

我正在使用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

2 个答案:

答案 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堆默认情况下可以划分如下(请注意,这是特定于平台的):

  • Eden 1.5G
  • 两个幸存者空间每个0.25G
  • 旧3G

通过调整不同区域的比率,更精细的配置将为您排序。