我在codeeval上尝试解决一个问题,但是使用了太多的内存。我的代码中有一个循环,由于一个大输入是不可避免的,它会运行很多次(~10,000^2)。我注意到,如果我运行循环并且在每次迭代中什么都不做,我总共使用大约6MB的内存。然而,如果我在循环中添加一个简单的方法调用,该方法只调用返回false的函数,我的内存使用量会跳到20MB。
为什么会这样?难道分配给每个函数调用的内存在函数调用完成后不会被释放吗?
编辑: 完整的代码非常庞大,与此无关,但这段代码片段就是我所描述的。如果我不包括
这是codeeval上的编码挑战,所以应该可以用他们允许的任何语言来解决问题,所以Java应该没问题。
编辑:我重构了一些代码,以便我可以提取出一个完整的函数来向你展示。这仍然会产生前面描述的相同结果。产生奇怪行为的函数调用是
为什么会这样?难道分配给每个函数调用的内存在函数调用完成后不会被释放吗?
编辑: 完整的代码非常庞大,与此无关,但这段代码片段就是我所描述的。如果我不包括
foo()
调用,则我的代码作为一个整体使用6MB的内存。如果我包括foo()
调用,则我的代码作为一个整体使用20MB的内存。在我的实际代码中,foo()
方法确实做了同样的事情(返回false),因为我想测试一下内存使用情况。这是codeeval上的编码挑战,所以应该可以用他们允许的任何语言来解决问题,所以Java应该没问题。
编辑:我重构了一些代码,以便我可以提取出一个完整的函数来向你展示。这仍然会产生前面描述的相同结果。产生奇怪行为的函数调用是
are_friends()
。ArrayList<ArrayList<Integer>> graph(String[] word_list) {
ArrayList<ArrayList<Integer>> adj_list = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < word_list.length; i++) {
adj_list.add(new ArrayList<Integer>());
}
for (int i = 0; i < word_list.length; i++) {
for (int j = i + 1; j < word_list.length; j++) {
if (are_friends(word_list[i], word_list[j])) {
adj_list.get(i).add(j);
adj_list.get(j).add(i);
}
}
}
return adj_list;
}
boolean are_friends(String a, String b) {
return false;
}
foo
不太可能会有任何内存影响。你能否尝试展示一个完整可运行的例子来重现这个问题? - assylias