2012-09-28 20 views
5

Dato il codice qui sotto.Garbage collection of private fields

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); 
    } 
} 

L'oggetto B può essere raccolto dopo la creazione dell'oggetto A?

risposta

6

Penso di no, perché è possibile accedere a questo campo tramite riflessione (utilizzando setAccessible(true)).

Teoricamente, compilatore in grado di dimostrare che questo campo non sarebbe mai essere raggiunto, e renderebbe B per la garbage collection (da JLS 12.6.1 Implementing Finalization):

Un oggetto raggiungibile è un qualsiasi oggetto che si può accedere in qualsiasi potenziale continuare il calcolo da qualsiasi thread live. L'ottimizzazione delle trasformazioni di un programma può essere progettata in modo da ridurre il numero di oggetti che sono raggiungibili per essere inferiori a quelli che sarebbero ingenuamente considerati raggiungibili. Ad esempio, un compilatore o un generatore di codice può scegliere di impostare una variabile o un parametro che non sarà più utilizzato per null per causare l'archiviazione per tale oggetto potenzialmente potenzialmente recuperabile prima.

Ma io non credo che nei compilatori di pratica e JVM sono così intelligenti

1

@Kuba Vuoi dire: può l'istanza della classe B nel campo b dell'istanza a di classe A essere garbage collection ? No. Non mentre a non è null come b viene fatto riferimento a a.

1

No, perché il thread principale ha un percorso da b a a.

0

Il compilatore standard non è così intelligente.

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()); 
    } 
} 

Questo codice butta fuori di un'eccezione di memoria dopo un numero molto limitato di cicli, quindi la risposta alla domanda iniziale è sicuramente no.