Что провоцирует вызов garbage collector в Java
Я знаю, что Garbage Collector производит очистку всегда перед тем, как выдается OutOfMemoryError, но хотелось бы узнать, в каких ситуациях это происходит еще. Почему, например, в данном случае не производится автоматический сбор мусора после того, как единственная переменная ссылающаяся на ArrayList перестает на него ссылаться, и на каждом проходе в последнем цикле выводится один и тот же объем задействованной памяти?
import java.util.ArrayList;
public class Exp {
public static void main(String[] args) throws InterruptedException {
Runtime r = Runtime.getRuntime();
ArrayList<Integer> al = new ArrayList<>();
System.out.println(r.totalMemory() - r.freeMemory());
for (int i = 0; i < 100_000_000; i++)
al.add(i);
System.out.println(r.totalMemory() - r.freeMemory());
al = null;
for (int i = 0; i < 10; i++) {
System.out.println(r.totalMemory() - r.freeMemory());
Thread.sleep(60000);
}
}
}
Ответы (1 шт):
Тут достаточно информативная статья на Хабре, сборщик мусора вызывается при превышении определенного процента занятой памяти. Он проходит по всем ссылкам и в зависимости от их типа, освобождает место в куче.
Так же можно "попросить" сборщик мусора сработать, но он не обязательно сработает, с помощью команды System.gc()