2012-09-28 24 views
5

Dado el código siguiente.Recolección de basura de campos privados

class A { 
    private B b; 
    public A() { 
     b = new B(); 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     A a = new A(); // two objects are created (a and b) 
     // <-- is B object, referenced only by private a.b eligible for garbage collection? 
     keepAlive(a); 
    } 
} 

puede b recolección de datos innecesarios objeto después de que se crea el objeto A?

Respuesta

6

Creo que no, porque este campo todavía se puede acceder a través de la reflexión (utilizando setAccessible(true)).

Teóricamente, el compilador puede demostrar que nunca se puede acceder a este campo, y haría B aptos para reciclaje (de JLS 12.6.1 Implementing Finalization):

Un objetivo alcanzable es cualquier objeto que se puede acceder en cualquier potencial continuar el cálculo desde cualquier hilo en vivo. Se pueden diseñar transformaciones de optimización de un programa que reduzcan la cantidad de objetos accesibles para que sean inferiores a los que ingenuamente se considerarían alcanzables. Por ejemplo, un compilador o generador de código puede optar por establecer una variable o parámetro que ya no se utilizará para anular para hacer que el almacenamiento de dicho objeto sea potencialmente recuperable antes.

Pero no creo que en los compiladores de práctica y las JVM son tan inteligentes

1

@Kuba ¿Quiere decir: puede ser recolectado la instancia de la clase B en el campo de b instancia de la clase aA ? No. No mientras a no es null ya que b se hace referencia en a.

1

No, porque el hilo principal tiene una ruta a b a través de a.

0

El compilador estándar no es tan inteligente.

class A 
{ 
    private Object[] array; 

    public A() 
    { 
     array = new Object[10000000]; 
    } 
} 

public static void main(String[] args) 
{ 
    LinkedList<A> list = new LinkedList<A>(); 
    while (true) 
    { 
     list.add(new A()); 
    } 
} 

Este código echa de excepción de memoria después de un muy pequeño número de bucles, así que la respuesta a la pregunta original es definitivamente no.