Рассмотрим следующий классJava вывоз мусора из частного поля
public class A {
private final Map<Integer, HeavyObject> cache;
public HeavyObject getThing();
}
Предполагая, что ссылки на кэш не может быть просочились, будет кэш быть мусора, когда экземпляры являются? Я также предполагаю, что HeavyObject в конечном итоге выходит за рамки.
У меня есть основания полагать, что это не так, если посмотреть на кучу, есть случаи, когда экземпляры A освобождаются, а HeavyObject в конечном итоге приводит к остановке JVM для большого количества GC.
Адрес одного из комментариев. getThing() вызывается в функции вида:
void compute(A a) {
...
while(condition) {
...
HeavyThing thing = a.getThing();
...
}
}
Так что никакого способа HeavyThing не выходит из времени.
Жизненный цикл является
Set<A> theAs = new HashSet();
while(true) {
for(int i = 0; i < 16; i++) theAs.add(new A());
theAs = computeNewAs(theAs);
}
Обратите внимание, что хитрый бит, что computeNewAs всегда держит 8 экземпляров из старого набора. Так что, глядя на распределение памяти в какой-то момент, я вижу всегда 8 экземпляров A, но огромное количество HashMaps и HeavyObject
Какой GC (G1 или CMS) вы используете? Кроме того, следует отметить, что порядок освобождения может быть произвольным. –
Если экземпляр больше не доступен, он в конечном итоге будет собран. Но есть много способов утечки экземпляров, которые на самом деле не очевидны. Возможно, вы захотите предоставить минимальный пример, который фактически создает утечку памяти. –