Я просто наткнулся на странный эффект и, отслеживая его, заметил, что, по-видимому, существует существенная разница в производительности для сбора внутренних и статических вложенных классов. Рассмотрим этот фрагмент кода:
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 МБ) этот код занимает около 20 минут для выполнения на моей машине. Теперь, просто заменив внутренний класс статическим вложенным классом, я могу сократить время выполнения до менее 6 минут. Вот изменения:
private static class Pointer {
и
Pointer p = new Pointer();
Теперь мои выводы из этого небольшого эксперимента заключаются в том, что использование внутренних классов значительно усложняет работу GC, если объекты могут быть собраны, делая статические вложенные классы более чем в 3 раза быстрее в этом случае.
Мой вопрос в том, правильно ли это заключение; если да, то в чем причина, и если нет, то почему здесь более низкие внутренние классы?