variable usar sirve que para metodos metodo internas estaticos cuando clases clase anonimas java garbage-collection inner-classes

java - usar - ¿Los objetos de clase interna no estáticos se recogen después de que ya no se hace referencia a ellos?



public static java (4)

Tengo un único grano de primavera similar al siguiente:

public class MyServiceImpl { private MyDAO myDAO; public class MyInnerClass implements SomeInterface<MyInnerClass> { @Override public MyInnerClass loadFreshObject(final String key) { return myDAO.load(key); } } }

Las instancias de MyInnerClass se están creando en un código fuera del bean de resorte, pero no se conservan referencias a esas instancias.

Suponiendo que no tengo control sobre el uso de estas clases internas públicas no estáticas (sé que idealmente serían privadas y estáticas para evitar filtrar la referencia a ''esto''), ¿las instancias creadas de ''MyInnerClass'' se recogerán correctamente?

He realizado mis propias pruebas al anular el finalize() y parece que las instancias se están recolectando correctamente, solo esperaba una aclaración al respecto.

Gracias


¿Por qué no recogerían la basura? El GC no se preocupa por el tipo de objeto. Si es inalcanzable, está GCed. Si es alcanzable, no tiene GC.


Las instancias de la clase interna se recogerán de forma incorrecta según las reglas normales (es decir, cuando ya no se mencionen). Sin embargo, cada instancia de la clase interna contiene una referencia oculta a su instancia principal de la clase externa. Esto significa que si hay referencias en vivo a instancias de la clase interna, evitarán que las instancias asociadas de la clase externa sean recolectadas. Pero solo funciona en esa dirección, no al revés.


Por supuesto, por cierto, si sus instancias son guardadas por Spring como beans singleton, Spring (pero no su código) mantendrá la referencia a ellos y no serán recolectados.


Si no hay referencias al objeto, se marcará para la recopilación. Por lo tanto, debería estar bien, incluso si se trata de una clase interna pública, no estática.

A la inversa, es decir, si hubiera referencias a estos objetos de clase interna, entonces el objeto de clase externa no se recogerá, incluso si no hay referencias directas a él.