2010-02-03 5 views
7

Ho una teoria che il meccanismo di garbage collection CLR significa che posso ottenere via riferimenti circolari nella mia gerarchia di oggetti senza creare deadlock per la rimozione e la garbage collection. È un presupposto sicuro da fare? (Lingua di destinazione VB.NET)La metodologia di raccolta dei dati inutili CLR indica che è sicuro lanciare riferimenti di oggetti circolari?

+0

Vedi qui per una domanda simile con una buona risposta accettata http://stackoverflow.com/questions/400706/circular-references -cause-memory-leak –

+0

@David: AZ ha detto che non usa il conteggio dei riferimenti. –

+0

@Johannes: era un errore di battitura nel mio commento, intendevo la domanda (non la risposta) la domanda iniziale era se l'uso del conteggio dei riferimenti in CLR rendesse i cicli non sicuri. La domanda (non la risposta di AZ) era sbagliata su come il CLR esegue GC. –

risposta

11

Il garbage collector .NET è un contrassegno generazionale e un programma di raccolta. Non usa il conteggio dei riferimenti. Quindi sì, è sicuro avere riferimenti circolari. lingua è irrilevante

+1

Basta fare molta attenzione per evitare di passare un riferimento a una statica e anche ricordare che i delegati conteranno come riferimento all'oggetto su cui sono implementati. molto facile mantenere le cose in vita con cose come un elenco di gestori di eventi statici. – morechilli

3

Secondo questo articolo: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5109829.html

circolare riferimento è un problema che si verifica quando ci sono due oggetti che si riferiscono a ogni altro. Diciamo che hai Classe A che fa riferimento alla Classe B. Se anche la Classe B fa riferimento alla Classe A, allora abbiamo un riferimento circolare . Questo succede in molte situazioni. Un tipico esempio di è una relazione genitore-figlio tra oggetti, dove il bambino interagisce con l'oggetto genitore e contiene anche un riferimento all'oggetto genitore . Ciò potrebbe portare agli oggetti che non sarebbero stati rimossi fino all' l'applicazione è stata chiusa. Il metodo di raccolta dei rifiuti .NET risolve il problema del riferimento circolare perché il Garbage Collector è in grado di correggere per pulire qualsiasi oggetto che sia raggiungibile dalla radice.

EDIT:
A giudicare da questo post: http://blogs.msdn.com/abhinaba/archive/2009/01/27/back-to-basics-reference-counting-garbage-collection.aspx sembra che la raccolta dei rifiuti di Net non si basa sul conteggio di riferimento per la raccolta dei rifiuti.

Un altro articolo la pena di leggere (spiega garbage collection in dettaglio) è questa: http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

+2

"che NON è raggiungibile dalla radice" –

Problemi correlati