Java OutOfMemoryError 与 ArrayList<List<Integer>>
Java OutOfMemoryError with ArrayList<List<Integer>>
我想在 Java 中创建一个非常大的图(有大约 1000 万条边)。我打算用List<List<Integer>>
来描述边,里面用List<Integer>
描述每条边的两个顶点(而且顶点都是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 的更多内存:
转到 运行 -> 运行 配置。你会看到这个 window
点击参数
输入您对 VM 的参数
由于除了设置最大堆参数外还使用了大量 RAM,因此请确保使用 64 位 Java。 32 位限制为 2 Gigs 或类似的东西。
此外,对于大型图表,您应该考虑使用数据库。
最后但同样重要的是,也许您可以重新考虑您的算法,有时您只是不需要所有的节点和边。
我想在 Java 中创建一个非常大的图(有大约 1000 万条边)。我打算用List<List<Integer>>
来描述边,里面用List<Integer>
描述每条边的两个顶点(而且顶点都是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 的更多内存:
转到 运行 -> 运行 配置。你会看到这个 window
点击参数
输入您对 VM 的参数
由于除了设置最大堆参数外还使用了大量 RAM,因此请确保使用 64 位 Java。 32 位限制为 2 Gigs 或类似的东西。
此外,对于大型图表,您应该考虑使用数据库。
最后但同样重要的是,也许您可以重新考虑您的算法,有时您只是不需要所有的节点和边。