2013-07-11 15 views
7

Nell'obiettivo C, è possibile che due diversi riferimenti possano puntare l'un l'altro.Due riferimenti oggetto puntano l'uno sull'altro

Ma è possibile in Java? Voglio dire, possono due riferimenti di oggetti puntare l'un l'altro? Se è possibile, quando saranno raccolti i rifiuti?

E, In caso di classi nidificate, due oggetti (classe interna e classe esterna) sono collegati tra loro - come vengono raccolti questi oggetti?

+2

Un riferimento a un oggetto può solo puntare a un oggetto. Cosa intendi per due riferimenti a oggetti che si indicano l'un l'altro? –

+0

oh! Sono nuovo di java! Nel caso di classi annidate, due oggetti (classe interna e classe esterna) sono collegati tra loro. Se ho un qualche senso qui, come possono questi due ottenere spazzatura raccolti –

risposta

24

Suppongo che stiate parlando di riferimenti circolari. Il GC di Java considera gli oggetti "garbage" se non sono raggiungibili attraverso una catena che parte da una radice GC. Anche se gli oggetti possono puntare l'un l'altro per formare un ciclo, sono ancora idonei per GC se tagliati fuori dalla radice.

ci sono quattro tipi di radici GC in Java:

  1. variabili locali sono tenuti in vita dalla pila di un filo. Questo non è un vero riferimento virtuale all'oggetto e quindi non è visibile. A tutti gli effetti, le variabili locali sono le radici di GC.

  2. I thread Java attivi sono sempre considerati oggetti in tempo reale e sono pertanto root di GC. Questo è particolarmente importante per le variabili locali del thread.

  3. Le variabili statiche sono indicate dalle rispettive classi. Questo fatto li rende di fatto delle radici del GC. Le classi stesse possono essere raccolte tramite garbage, che rimuovono tutte le variabili statiche di riferimento. Ciò è di particolare importanza quando utilizziamo server di applicazioni, contenitori OSGi o caricatori di classi in generale.

  4. I riferimenti JNI sono oggetti Java che il codice nativo ha creato come parte di una chiamata JNI. Gli oggetti così creati vengono trattati in modo speciale perché la JVM non sa se viene referenziata dal codice nativo o meno. Tali oggetti rappresentano una forma molto speciale di root GC.

È anche possibile leggere here per ulteriori informazioni.

enter image description here

+0

grazie mille. –

3

Naturalmente si possono avere gli oggetti di riferimento l'un l'altro. Si potrebbe semplicemente passare il puntatore this in entrambi gli oggetti tra loro, che è perfettamente valido.

Tuttavia, ciò non significa che gli oggetti siano ancora accessibili dalla radice del GC. Pensalo come un albero (grafico). Se si taglia un ramo completo dal tronco, l'intero ramo viene perso, indipendentemente dal numero di oggetti coinvolti o da riferimenti reciproci.

4

Sì, puoi farlo. Come questo:

class Pointy { 
    public Pointy other; 
} 

Pointy one = new Pointy(); 
Pointy two = new Pointy(); 
one.other = two; 
two.other = one; 

Sono garbage collection quando entrambi gli oggetti non sono puntati da qualcosa di diverso da un altro, o altri oggetti che sono "irraggiungibili" dal codice attualmente in esecuzione. I garbage collector Java sono "tracing" garbage collectors, il che significa che possono scoprire questo tipo di problema.

Al contrario, i sistemi reference-counted (come l'Objective C senza la sua "moderna" garbage collection - non so quale sia l'impostazione predefinita) in genere non possono rilevare questo tipo di problema, quindi gli oggetti possono essere trapelati.

Problemi correlati