java - Java中的堆内存错误

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

我正在对 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 个元素)。

最佳答案

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

对于 n = 113383,运算使您通过整数限制,n 变为负数,这将以无限循环结束。

如果将 Integer 更改为 Long,则有效。

关于java - Java中的堆内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43698334/

相关文章:

java - gradle 如何决定 file.encoding JVM 系统属性?

java - Android谷歌地图添加标记时出现空指针异常

java - 堆栈大小由什么决定?

java - 如何克服大文件写入期间的 OutOfMemoryError

java - 是否有一个 Map 实现将内容持久保存到数据库而不是内存?

java - 在另一台计算机上运行 .jar 文件时通信链路失败,但在我的计算机上运行正常

Java - 为什么具有匹配签名的 SAM 类型不可互换?

java - 为什么在 jstat -gcutil 的结果中显示的不是 FullGC,而是老一代从 99% 到 14%?

java - 在Windows中使用Eclipse增加Java堆大小

java - 为什么下面的按位运算会产生数值溢出?