2009-04-27 10 views

risposta

37

Oggetto Un oggetto di riferimento B. Oggetto B fa riferimento all'oggetto A. Né l'oggetto A né l'oggetto B fanno riferimento a nessun altro oggetto. Quella è un'isola di isolamento.

Fondamentalmente, un'isola di isolamento è un gruppo di oggetti che fanno riferimento tra loro ma non sono referenziati da alcun oggetto attivo nell'applicazione. A rigor di termini, anche un singolo oggetto non referenziato è un'isola di isolamento.

Modifica dal commento:

class A { 
    B myB; 
} 
class B { 
    A myA; 
} 

/* later */ 
A a = new A(); 
B b = new B(); 
a.b = b; 
b.a = a; 
+0

Questo post potrebbe essere vecchio.ma la mia domanda questa è una mia domanda potrebbe essere kiddie ma quando dici Oggetto A fa riferimento all'oggetto B. Oggetto B fa riferimento all'oggetto A. Intendi dire qualcosa come questo A a = B; B b = a? – user962206

+5

@ user962206 No significa "classe A {B myB; } classe B {A myA; }/* later */A a = new A(); B b = nuovo B(); a.b = b; b.a = a; 'Se riesci a decifrarlo ... Ma in tutta onestà, è sufficiente avere' classe A {B myB; } classe B {} B b = nuova B(); A a = new A(); a.b = b; ' – corsiKa

9

Questo è un good explanation di questo termine. Estratto:

  • "Se un obj1 oggetto è garbage collection, ma un altro oggetto obj2 contiene un riferimento ad esso, allora obj2 è anche beneficiare di garbage collezione"
  • "Se oggetto obj2 può accedere oggetto obj1 che è per la garbage collection , allora obj2 è anche beneficiare per la garbage collection"

Questo si chiama 'Isola di isolamento'. Un'isola di isolamento descrive uno o più oggetti non hanno riferimenti a da parti attive di un'applicazione .

8

La cosa da tenere a mente è che gli oggetti sono raccolti solo se si fa riferimento, direttamente o indirettamente, da un oggetto radice GC (discussioni, corrente variabili locali, variabili statiche ecc.). Se due (o più) oggetti si riferiscono l'un l'altro, ma non sono referenziati da una radice, allora sono eleggibili per la garbage collection.

2

In realtà, se si capisce il concetto di Marco e Sweep di Garbage Collection, potrai capire meglio Isola di isolamento troppo:

  • L'algoritmo inizia dalle radici GC: thread principale, le variabili locali in il metodo principale, le variabili statiche della classe principale.
  • L'algoritmo attraversa tutti i riferimenti a oggetti, a partire dalle radici di GC e contrassegna tutti gli oggetti trovati come vivi.
  • Tutta la memoria heap non occupata da oggetti contrassegnati viene recuperata. Viene semplicemente contrassegnato come libero, essenzialmente privo di oggetti inutilizzati.
  • Se due o più oggetti si riferiscono l'un l'altro ma non sono referenziati da oggetti collegati a una radice, si trovano nell'Isola di isolamento e sono anch'essi spazzati.
0

Isola di isolamento:

  1. oggetto 1 riferimenti agli oggetti 2 e oggetto 2 riferimenti oggetto 1. Né Oggetto 1 né oggetto 2 è riferisce a qualsiasi altro oggetto. Quella è un'isola di isolamento.
  2. Fondamentalmente, un'isola di isolamento è un gruppo di oggetti che si richiamano a vicenda ma non sono referenziati da alcun oggetto attivo nell'applicazione. A rigor di termini, anche un singolo oggetto senza riferimento è un'isola di isolamento.

Esempio:

public class Test 
{ 
    Test i; 
    public static void main(String[] args) 
    { 
     Test t1 = new Test(); 
     Test t2 = new Test(); 

     // Object of t1 gets a copy of t2 
     t1.i = t2; 

     // Object of t2 gets a copy of t1 
     t2.i = t1; 

     // Till now no object eligible 
     // for garbage collection 
     t1 = null; 

     //now two objects are eligible for 
     // garbage collection 
     t2 = null; 

     // calling garbage collector 
     System.gc(); 

    } 

    @Override 
    protected void finalize() throws Throwable 
    { 
     System.out.println("Finalize method called"); 
    } 
} 

uscita:

  • metodo Finalize chiamato
  • metodo
  • Finalize chiamato

Spiegazione:

  • Prima distruggendo un oggetto, chiamate Garbage Collector metodo al massimo una volta su tale oggetto finalizzare.

  • Procedimento motivo inalize chiamato due volte in nell'esempio precedente perché due oggetti sono idonei per collection.This spazzatura è perché non avere riferimenti esterni T1 e T2 oggetti dopo esecuzione t2 = null.

  • Tutto ciò che abbiamo sono solo riferimenti interni (che è nella variabile di esempio i di classe Test) a loro uno dell'altro. Non è possibile chiamare la variabile di istanza di entrambi gli oggetti. Quindi, nessuno degli oggetti può essere richiamato .

Fino t2.i = t1: Entrambi gli oggetti hanno riferimenti esterni T1 e T2. enter image description here

t1 = null: Entrambi gli oggetti possono essere raggiunti tramite t2.i e t2 rispettivamente. enter image description here

t2 = null: Non c'è modo di raggiungere uno qualsiasi degli oggetti. enter image description here

Ora, entrambi gli oggetti sono ammissibili per la garbage collection non c'è modo li possiamo chiamare.:)