2012-02-24 17 views
11

I tienen un solo grano de resorte similar al siguiente:¿Los objetos de clase interna no estáticos se recogen después de que ya no se hace referencia a ellos?

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 código fuera del grano de primavera, pero se mantienen ninguna referencia a aquellos casos.

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'), serán las instancias creadas de 'MyInnerClass' basura correctamente recogida?

He realizado mis propias pruebas al sobreescribir el finalize() y parece que las instancias están siendo correctamente recolectadas, solo esperaba aclaraciones al respecto.

Gracias

+0

"* Un iterador de una colección normalmente se implementa como una clase interna de la colección. *" Me ayudó a entender la relación entre las vidas de las clases externas e internas. –

Respuesta

16

Las instancias de la clase interna se recolectarán como basura de acuerdo con las reglas normales (es decir, cuando ya no se haga referencia a ellas). 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.

0

Si no hay referencias al objeto, que serán marcados para su recolecció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.

3

¿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.

+0

Eso es lo que pensé, simplemente no lo era si había alguna referencia implícita de la clase externa a la clase interna. –

+0

No, no hay. Lo contrario es verdad. La clase interna no estática contiene una referencia a su instancia de clase externa. –

0

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

Cuestiones relacionadas