Java 中的堆内存错误

Heap memory error in Java

我正在对 Java 进行一些修改,但在其他一些语言方面有很多经验。 我有一个我知道解决方案的测试问题(并且可以在 Python 和 C++ 中轻松生成)。但是 运行 下面的 Java 代码给出了一个

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我想知道我是否犯了一个简单的错误,我根本不认为这个程序的内存占用量会很大:

public static void main(String[] args) {
    ArrayList<Integer> longest_sequence = new ArrayList<>();
    ArrayList<Integer> this_sequence;
    int n = 0;

    for (int i = 1; i < 1000000; i++) {
        this_sequence = new ArrayList<Integer>();

        n = i;
        this_sequence.add(n);
        while (n != 1) {
            if (n % 2 == 0) {
                n = n / 2;
            }
            else {
                n = 3*n + 1;
            }
            this_sequence.add(n);
        }
        if (this_sequence.size() > longest_sequence.size()) {
            longest_sequence = this_sequence;
        }
    }

    System.out.println(longest_sequence.get(0));
    System.out.println(longest_sequence.size());

}

进一步说明:

程序的每次迭代都会创建一个新列表。它要么通过将 longest_sequence 分配给它来保留,要么被丢弃并被新的列表实例覆盖。

我猜我的假设是不正确的,并且实例正在被保留?列表的大小应该不是问题(最大的大约有 500 个元素)。

我认为最容易避免这种情况的方法是使用 -Xmx 标志添加内存

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html 这里有官方文档,可以阅读更多相关信息

要更改 Eclipse 的 VM,您可以从 Windows> 首选项> Java> 从那里安装的 JRE select JRE 更改 MV 的数量,然后单击编辑,然后写入默认 VM 参数:写入 -Xmx1024M 或任何其他内存量 ...

好吧,这是不言自明的:您 运行 内存不足。

您可能想尝试以更多内存启动它,使用 -Xmx 标志,例如

java -Xmx2048m [无论你之前写过什么] 这将使用多达 2 GB 的内存。

有关详细信息,请参阅非标准选项列表。

即使增加堆也会失败space。

对于 n = 113383,一个操作使您通过整数限制并且 n 变为负数,这将以无限循环结束。

如果您将 Integer 更改为 Long,它会起作用。