Qualcuno potrebbe spiegare il concetto di Isola di isolamento di Garbage Collection?"Isola di isolamento" di Garbage Collection
risposta
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;
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 .
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.
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.
Isola di isolamento:
- 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.
- 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.
t1 = null: Entrambi gli oggetti possono essere raggiunti tramite t2.i e t2 rispettivamente.
t2 = null: Non c'è modo di raggiungere uno qualsiasi degli oggetti.
Ora, entrambi gli oggetti sono ammissibili per la garbage collection non c'è modo li possiamo chiamare.:)
- 1. Garbage Collection di membri statici
- 2. Algoritmo di garbage collection JVM
- 3. Garbage collection - root node
- 4. WinRT ha Garbage Collection?
- 5. Scala Garbage Collection?
- 6. Unusual Garbage Collection Patterns
- 7. GWT Garbage Collection
- 8. impedisce la garbage collection
- 9. Utilizzando e Garbage Collection
- 10. Chiarimento PHP Garbage Collection
- 11. requestAnimationFrame garbage collection
- 12. Garbage collection in bash
- 13. indesiderati Garbage Collection
- 14. Generatori PHP - Garbage Collection
- 15. Lua: garbage collection + datiutente
- 16. java garbage collection
- 17. Garbage collection e cgo
- 18. Forcing Garbage Collection
- 19. Garbage Collection in Delphi
- 20. Java: algoritmi di garbage collection disponibili
- 21. Force Garbage Collection di array, C#
- 22. Ruby Classe oggetto Garbage Collection
- 23. Garbage collection in Perl threads
- 24. Java 8 metaspace garbage collection
- 25. Garbage Collection e puntatori condivisi
- 26. Node.js e V8 garbage collection
- 27. Unity3D: ottimizza la garbage collection
- 28. Garbage collection manuale in Python
- 29. Numpy e matplotlib garbage collection
- 30. C# Timers and Garbage Collection
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
@ 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