Java OutOfMemoryError即使结构正确?

Java OutOfMemoryError即使结构正确?,java,eclipse,out-of-memory,heap-memory,Java,Eclipse,Out Of Memory,Heap Memory,我正在使用Java中的2Dint数组,这些数组是正方形的,在一行和一列中可以有大约30000个元素,这意味着数组中有30000^2*4个字节,小于5GB(我的可用内存远远超过5GB) 我的课程基本结构如下: public class A { public static void main(String[] args) { Graph g = ...; // read from file System.out.println(B.computeSomethi

我正在使用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
我已经打印出了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];
        }
}
如果没有任何参数,ie
JavaA
将导致OOM错误。运行
java-Xms5g-Xmx10g A
。我猜数值比你想象的要大。为什么不在分配之前输出它以确保


也考虑到你的<代码>图>代码>,或者应用程序中的其他对象也可以使用堆空间。

你所面临的情况是堆内没有单独的区域(如EDEN、Survior或Road)大到足以容纳你要分配的数据结构。例如,默认情况下,5G堆可以按以下方式划分(请注意,这是特定于平台的):

  • 伊甸园1.5G
  • 两个幸存者空间,每个0.25G
  • 旧3G

通过调整不同区域的比率来进行更细粒度的配置,将为您解决问题。

您认为您可以声明这样一个数组吗?30000乘30000???@usar这是什么意思?您声明的数组中包含30000个整数,每个数组中包含30000个整数them@Thilo
新的T[int_值][int_值]
初始化两个维度(
newt[int\u value][/*empty*/]
只会先初始化),而@Ryan
int
实际上是4个字节。创建(仅)
int[30000][30000]
在x64上的7u55中使用
-Xmx4G
,并且
Runtime.totalMemory()-.freemory()
确认它使用的字节略多于3.6e9字节。因此,堆基本上只特定于调用它的主方法?而不是它调用的任何方法(可能在其他类中)?@Ryan不,Java堆是为应用程序中的对象保留的空间。那么,为什么你的解决方案有效而我的解决方案无效呢?我用同样的方式创建一个2D数组,只是用一种不同的方法。二维数组涉及一些开销(与手动映射到一维数组相反)。在这些大小下,这可能很重要。@jdpenix有趣-运行时,InitialHeapSize和MaxHeapSize都为2^32(4294967296)。