Java中的堆内存错误

时间:2017-04-29 17:05:01

标签: java jvm out-of-memory heap-memory

我正在修补一些Java,但在其他一些语言方面有很多经验。 我有一个测试问题,我知道解决方案(并且可以很容易地用Python和C ++生成)。但是运行以下Java代码会产生一个

  

线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

我想知道我是否犯了一个简单的错误,我不希望这个程序的内存占用量非常大:

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个元素)。

3 个答案:

答案 0 :(得分:2)

即使增加堆空间,它也会失败。

对于n = 113383,操作会使您通过整数限制而n变为负数,这将以infite循环结束。

如果你用长整数改变整数,它就有效。

答案 1 :(得分:0)

我认为最容易避免的是使用-Xmx标志添加内存

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html 这是官方文档,可以阅读更多关于它的文件

答案 2 :(得分:0)

要更改Eclipse的VM,您可以从Windows更改MV的数量&gt;偏好&GT; Java和GT;从那里安装JRE选择JRE并单击编辑,然后在默认VM参数中写入:-Xmx1024M或任何其他数量的内存......

嗯,这是相当不言自明的:你已经没有记忆了。

您可能想尝试使用-Xmx标志启动它,例如

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

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