我正在修补一些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个元素)。
答案 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演出的内存。
有关详细信息,请参阅非标准选项列表。