[英]Java OutOfMemoryError with ArrayList<List<Integer>>
我想用Java创建一个非常大的图形(有大约1000万条边)。 我计划List<List<Integer>>
来描述边缘,内部List<Integer>
描述每条边的两个顶点(并且顶点是整数类型)。
在将约100万条边添加到图形后,以下代码抛出OutOfMemoryError
。 (为了讨论起见,我简化了边缘的生成方式。)
public static void main(String[] args) {
List<List<Integer>> graph = new ArrayList<List<Integer>>();
for (int i = 0; i < 10000000; i++) {
List<Integer> edge = new ArrayList<Integer>();
// the real edges are more complicated (than from vertex i to vertex i+1)
// this is simplified for the sake of the discussion here
edge.add(i);
edge.add(i+1);
graph.add(edge);
}
}
我搜索了OutOfMemoryError
,并且我已经将Eclipse的初始堆大小增加到2G: -Xms2g -Xmx4g -Xss2m
(它被传递给JVM)。 但这并没有解决问题。
然后我想也许我应该通过调用System.gc()
来垃圾收集List<Integer> edge
变量,以防它的内存没有被清除。 那也行不通。
我在想可能问题在于List<List<Integer>>
数据结构。 我尝试了List<int[]>
,这持续了一段时间:在OutOfMemoryError
发生之前添加了更多边。 我现在没有更好的主意。
我一直在寻找类似的问题,但没有找到太多帮助。 我想知道是否有人有这种情况的经验。
让程序使用Eclipse中的更多内存:
转到“运行” - >“运行配置”。 你会看到这个窗口
单击Arguments
输入您的VM参数
由于除了设置max heap参数之外还要使用大量RAM,因此请确保使用64位Java。 32位仅限于2 Gigs或类似的东西。
此外,对于大型图表,您应该考虑使用数据库。
最后但并非最不重要的是,也许您可以重新考虑您的算法,有时您不需要所有的节点和边缘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.