Java堆空间异常

  • 本文关键字:异常 空间 Java java
  • 更新时间 :
  • 英文 :


这是我的代码:

public static void runSGD(double[] R, double[][] theta, double convergenceTol)
{
List<Integer> allEdges = new ArrayList<Integer>(2*E);    
for (int i = 0; i < 2*E; i++) 
allEdges.add(i);
Collections.shuffle(allEdges, new Random(shuffleSeed));
double oldRes = calcObj(R, theta, allEdges), newRes = 0.0;
long numEdges = 0;
for (int _e = 0; _e < 2*E*tp; _e++) {
int e = allEdges.get(_e);
numEdges += weights.get(e);
}
if (verbose)
System.out.printf("[Info] Number of edges in training, including multiplicity = %dn", numEdges);
int[][] edgeTable = new int[4][1<<30];
long part = 0; int cur = 0;
for (long i = 0; i < numEdges; i++) {
if (i+1 > part) {
part += weights.get(allEdges.get(cur));
cur++;
}
int row = (int) (i >>> 30);
int col = (int) (i & ((1 << 30) -1));
edgeTable[row][col] = allEdges.get(cur-1);
}
}

运行以下代码时错误为Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

int[][] edgeTable = new int[4][1<<30];

我试过-Xmx1g,-Xmx3g,但都没用,怎么解决?

您正在分配4个2^30 int的int[]数组。即2^34字节或16G字节。显然,这不适合1或3 GB的堆。事实上,一台典型的笔记本电脑或PC没有足够的RAM。。。

第二个问题是堆空间是否足够大,可以容纳2^32字节的对象,但如果可以使堆足够大,应该可以解决这个问题。

事实上,JVM支持不到2^31个元素的数组;请参阅Java数组有最大大小吗?,因此数组大小本身不是问题所在。

数组使用int来寻址单个数组元素。最大int值为2^31-1。您创建了4个大小为2^30的数组,这意味着您的数组中有2^32个元素。Java不支持这种大小的数组。

你可以通过制作4个不同的数组来修复它。

此外,使用-Xmx3g分配3GB也没有帮助,因为仅您的阵列就需要16GB的RAM。

正如其他人提到的,您正在尝试分配巨大的数组。您可以尝试分配小数组的块或尝试集合。

最新更新