Java OutOfMemoryError即使结构正确?
我正在使用Java中的2DJava 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
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];
}
}
如果没有任何参数,ieJavaA
将导致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*/]
只会先初始化),而@Ryanint
实际上是4个字节。创建(仅)int[30000][30000]
在x64上的7u55中使用-Xmx4G
,并且Runtime.totalMemory()-.freemory()
确认它使用的字节略多于3.6e9字节。因此,堆基本上只特定于调用它的主方法?而不是它调用的任何方法(可能在其他类中)?@Ryan不,Java堆是为应用程序中的对象保留的空间。那么,为什么你的解决方案有效而我的解决方案无效呢?我用同样的方式创建一个2D数组,只是用一种不同的方法。二维数组涉及一些开销(与手动映射到一维数组相反)。在这些大小下,这可能很重要。@jdpenix有趣-运行时,InitialHeapSize和MaxHeapSize都为2^32(4294967296)。