java - what - algoritmos de garbage collector
¿Son los oyentes anónimos incompatibles con referencias débiles? (2)
Sí, tienes razón, una clase escuchable que mantenga a los oyentes con referencias débiles (como lo hace WeakHashMap) requiere su persistencia independiente. Podría usarse para jerarquías de oyentes donde un oyente tiene hijos y un padre.
Para los usos que no sean de WeakReference se debe llamar a un removeListener explícito. A menos que el objeto de escucha pueda vivir tanto como el objeto escuchable. En la mayoría de los casos de uso está bien, y una clase anónima funcionará.
Con instancias de clase anónimas, puede ocurrir una fuga (prevención de GC) al acceder a un objeto final fuera del cuerpo de la clase.
Nota: WeakHashMap ia usa referencias débiles para su propia subclase de Map.Entry. Lo que a veces puede ser bastante alucinante.
Estaba leyendo esta pregunta que acabo de preguntar: ¿ Evitar fugas de memoria en las devoluciones de llamada?
Y estaba bastante confundido, hasta que alguien respondió lo siguiente:
"El problema con este enfoque es que no puede tener un oyente al que solo se hace referencia en la colección, ya que desaparecerá aleatoriamente (en el siguiente GC)"
¿Tengo razón al entender que el uso de referencias débiles, como cuando se almacena en un WeakHashMap , es incompatible con oyentes anónimos?
Normalmente paso a los oyentes de esta manera:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn''t be done from here (unrelated to the question)
}
}
Y hago un seguimiento de los oyentes que usan un CopyOnWriteArrayList (el Observable predeterminado anterior aparentemente usa un Vector antiguo, pero es solo un ejemplo para mostrar cómo normalmente creo una clase anónima para usar como oyente).
Como pregunta adicional: ¿cuándo la referencia al oyente anónimo será elegible para GC si el sujeto observable utiliza un WeakHashMap? ¿Cuándo sale el método principal ? ¿Tan pronto como termine la llamada obs.addObserver ?
Estoy un poco confundido acerca de dónde / cómo / cuándo las referencias a instancias de clase anónimas se mantienen / almacenan / son elegibles para GC.
Obviamente, si mantengo una referencia normal, no es elegible para GC, pero ¿qué ocurre cuando se encuentra en un WeakHashMap, cuándo es que el oyente se vuelve elegible para GC?
Si un objeto es solo la clave de un WeakHashMap, entonces es elegible y es probable que se limpie en el próximo GC.
La idea general de utilizar una colección de referencia Débil es eliminar implícitamente los escuchas a los que ya no se hace referencia. (Esto evita el potencial de una pérdida de memoria). El problema es que el oyente se puede eliminar prematuramente y en un momento "aleatorio".