Java,内存不足,功能低效

时间:2011-10-19 15:40:11

标签: java memory

我正在编写一个应该创建数字链的程序,并且看到一个是最长的。问题是我的内存耗尽,我不知道是什么吃了所有的内存。有谁知道问题是什么?

public static void main(String[] args) {

    ArrayList<Integer> longestchain;
    ArrayList<Integer> chain = new ArrayList<Integer>();
    int size = 0;
    int longestsize = 0;
    int start;
    int number = 0;

        for(int i = 3; i < 1000000; i++)
        {
            start = i;
            chain.clear();
            chain.add(start);
            size = 1;
            while(true)
            {
                if(start == 1)
                {
                    break;
                }
                if(iseven(start))
                {
                    start = start / 2;
                }
                else
                {
                    start = start*3 + 1;
                }

                chain.add(start);
                size++;

            }

            if(size > longestsize)
            {
                longestsize = size;
                longestchain = chain;
                number = i;

            }
            //System.out.println(i);

        }
        System.out.println(number + ". " + longestsize);

}

public static boolean iseven(int n)
{
    return (n % 2 == 0);
}

3 个答案:

答案 0 :(得分:4)

问题是当i=113383遇到整数溢出时。这会导致无限循环不断添加到chain,直到用完堆空间。将chainlongestchain更改为ArrayList<Long>,将start更改为long,将iseven()更改为long,您将解决该问题特别的问题。

另一个问题是longestchain = chain分配引用,而您需要复制内容。否则,下一次迭代将擦除longestchain

答案 1 :(得分:0)

这可能不是解决方案,而是提示:

ArrayList的默认数组大小为10.将ArrayLists初始化为更接近您期望值的值,或者在引擎盖下发生许多阵列创建:

// e.g.
ArrayList<Integer> chain = new ArrayList<Integer>(50000);

答案 2 :(得分:0)

不知道你为什么内存不足,但我注意到你的代码中有一个错误 - 最长链和链指向同一个对象,所以当你清除链时,你也清除了最长链。您可以通过创建一个包含链而不是赋值的内容的新数组来修复它。