java.lang.OutOfMemoryError:Java堆空间

时间:2010-10-06 20:45:29

标签: java

我正在尝试创建一个相当大的二维数组,并且我不断收到错误“java.lang.OutOfMemoryError:Java堆空间”。我已经尝试了-Xmx命令,但我仍然可以使用它。

我可以使用2D阵列吗?或者一种增加堆大小的方法。

2 个答案:

答案 0 :(得分:4)

如果不是矩阵的所有元素都被占用(或者甚至共享一个非常常见的默认值),你可以使用sparse matrix

执行此操作的最简单方法之一是使用HashMap:

Map<Point, Integer> matrix = new HashMap<Point, Integer>();

matrix.put(new Point(5, 2), 7);
Integer fiveTwo = matrix.get(new Point(5, 2));

您可以迭代所有索引,如下所示:

for ( int i = 0; i < ROW_COUNT; i++ ) {
    for ( int j = 0; j < COL_COUNT; j++ ) { 
       Integer val = matrix.get(new Point(i, j));
       //val is null here if not stored in the matrix.  Replace with a different
       //default as desired.  eg:
       //if ( val == null ) val = 0;
       process(val);
    }
}    

也很容易迭代被占用的索引:

for ( Entry<Point, Integer> entry : matrix ) {
    process(entry.getValue());
}

虽然这可能会返回一些已明确设置为默认值的单元格。使用此实现更困难的是仅按特定顺序迭代占用的索引。

这是上面链接的维基百科文章中描述的“密钥字典”实现的一个例子。

答案 1 :(得分:1)

考虑使用Flyweight pattern来降低对象的分配成本。正如Jon Skeet( Tips hat )所做的那样,它实际上取决于数组的大小,以及它中的内容。 Flyweight可以为你买很多东西,但只有这么多。