内存不足:Java堆空间

时间:2017-02-07 19:36:18

标签: java garbage-collection big-o

我正在做Big O Notation的家庭作业。我们需要创建具有越来越多的整数的列表,然后计算对列表进行排序以确定哪个Big O Collection.sort()所需的时间。

我编写了一些代码来执行此操作,并生成有关sort方法在每个列表大小的几次迭代过程中所花费多长时间的数据。

我能够对50,000个整数的列表进行排序,但如果我再次尝试完全相同的操作,我将耗尽内存。我认为垃圾收集器应该回收我的记忆,所以理论上应该没有问题重复操作。

我已经读过将大变量设置为null,而不是在for循环块之外存储对大型列表的引用。我认为没有理由任何对我的整数列表的引用应该保持活着。

垃圾收集器无法回收我的记忆我做错了什么?

        private static TreeMap<Integer, ArrayList<Long>> doExperiment(int iterations, int step, int trials, List listType) {
    TreeMap<Integer, ArrayList<Long>> results = new TreeMap();
    for (int i = 1; i <= iterations; i++) {
        // Data size ranges from 1000 - 50,0000 if step = 1000 and iterations = 50
        int dataSize = i * step;
        ArrayList<Long> trialResults = new ArrayList<Long>();
        for (int j = 1; j <= trials; j++) {
            // This may be LinkedList, ArrayList depending on the parameter.
            List thisList = listType;
            // dataSize works up to 50,000 Integers.
            Testing t = new Testing(dataSize, thisList);
            long nanos = t.timedSort();
            // Prints a formatted string to standard output.
            processResults(nanos, j, trials, i, iterations);
            // The large list exists only within this Testing instance. Set it to null
            t = null;
            // Please, garbage collection Gods...
            System.gc();
        }
        results.put(dataSize, trialResults);
    }
    return results;
}

2 个答案:

答案 0 :(得分:3)

System.gc(); - 无法保证启动垃圾收集器

List thisList = listType; - 复制参考(我猜这是错误的) 所以当你Testing t = new Testing(dataSize, thisList);时 - 这实际上与Testing t = new Testing(dataSize, listType);

相同

可能你想这样做:List thisList = new ArrayList(listType); - 是的。这会创建新列表,但在这种情况下,测试将运行新列表,但不会使用相同的列表。

ArrayList<Long> trialResults = new ArrayList<Long>(); // you create new list
....
results.put(dataSize, trialResults); // do you want to put empty list in the result? 

答案 1 :(得分:1)

buildQuery(criteria).then(runQuery).then(results => … )