我正在做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;
}
答案 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 => … )