内部类与静态嵌套类的 GC 性能影响
我刚刚遇到了一个奇怪的效果,在跟踪它时,我注意到收集内部与静态嵌套类似乎存在很大的性能差异。请考虑以下代码片段:
public class Test {
private class Pointer {
long data;
Pointer next;
}
private Pointer first;
public static void main(String[] args) {
Test t = null;
for (int i = 0; i < 500; i++) {
t = new Test();
for (int j = 0; j < 1000000; j++) {
Pointer p = t.new Pointer();
p.data = i*j;
p.next = t.first;
t.first = p;
}
}
}
}
因此,代码的作用是使用内部类创建链接列表。该过程重复 500 次(用于测试目的),丢弃上次运行中使用的对象(这些对象受 GC 约束)。
当使用严格的内存限制(如 100 MB)运行时,此代码大约需要 20 分钟才能在我的计算机上执行。现在,只需将内部类替换为静态嵌套类,我就可以将运行时减少到 6 分钟以内。以下是更改:
private static class Pointer {
和
Pointer p = new Pointer();
现在,我从这个小实验中得出的结论是,使用内部类会使GC更难确定是否可以收集对象,在这种情况下,静态嵌套类的速度提高了3倍以上。
我的问题是,这个结论是否正确;如果是,原因是什么,如果不是,为什么内部类在这里要慢得多?