Mike..
44
通常是代码.这是一个简单的例子:
import java.util.*;
public class GarbageCollector {
public static void main(String... args) {
System.out.printf("Testing...%n");
List list = new ArrayList();
for (int outer = 0; outer < 10000; outer++) {
// list = new ArrayList(10000); // BAD
// list = new ArrayList(); // WORSE
list.clear(); // BETTER
for (int inner = 0; inner < 10000; inner++) {
list.add(Math.random());
}
if (outer % 1000 == 0) {
System.out.printf("Outer loop at %d%n", outer);
}
}
System.out.printf("Done.%n");
}
}
使用java 1.6.0_24-b07在Windows7 32位上.
java -Xloggc:gc.log GarbageCollector
然后看看gc.log
使用BAD方法触发444次
使用WORSE方法触发666次
使用BETTER方法触发354次
现在被授予,这不是最好的测试或最好的设计,但是当遇到除了实现这样的循环或者处理行为不好的现有代码时别无选择的情况时,选择重用对象而不是创建新对象可以减少垃圾收集器挡住的次数......
请澄清:当您说"触发n次"时,这是否意味着常规GC发生了n次,或者OP报告的"GC开销限制超出"错误发生了n次? (12认同)