Java OutOfMemoryError 与 ArrayList<List<Integer>>

标签 java arraylist out-of-memory

我想用 Java 创建一个非常大的图(有大约 1000 万条边)。我打算List<List<Integer>>描述边缘,用里面List<Integer>描述每条边的两个顶点(并且顶点是整数类型)。

以下代码抛出 OutOfMemoryError在将大约 100 万条边添加到图中之后。 (为了便于讨论,我简化了边缘的生成方式。)

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)。但这并没有解决问题。

然后我想也许我应该对 List<Integer> edge 进行垃圾回收变量,通过调用 System.gc() ,以防它的内存没有被清除。那也不管用。

我在想问题可能出在 List<List<Integer>> 上数据结构。我试过 List<int[]> ,持续时间更长:在 OutOfMemoryError 之前添加了更多边发生。我现在没有更好的主意。

我已经搜索过类似的问题,但没有找到太多帮助。不知有没有人遇到过这种情况。

最佳答案

让您的程序使用 Eclipse 的更多内存:

转到运行 -> 运行配置。你会看到这个窗口 Run Configurations

点击参数 Run Configurations/Arguments

将您的参数输入到 VM Run Configurations/Arguments/VM Arguments

关于Java OutOfMemoryError 与 ArrayList<List<Integer>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533263/

相关文章:

java - Android 使用 Java 和 REST 连接到 MySQL

java - Logback:通过 <nestedField> 进行双重嵌套字段

java - Collections.reverse 方法不反转条目

java - 如何使用 Twitter4J 流 API 避免 OutOfMemory 错误?

java - 如何使用堆转储识别 Java 内存分析器中对象的引用持有者

java - 需要帮助改进紧耦合设计

java - JPA/hibernate : code based validation of jpa queries

android.net.Uri$HierarchicalUri 无法转换为 java.util.ArrayList

java - ArrayList<String> 类型的完整名称

java - 使用 Calendar.SATURDAY 作为一周的最后一天时,Holo Calendar 崩溃