[Volevo solo aggiungere ulteriori informazioni sul processo di internazionalizzazione della finalizzazione]
Quindi, si crea un oggetto e quando l'oggetto viene raccolto, è Finalize
necessario chiamare il metodo dell'oggetto . Ma c'è molto altro da finalizzare rispetto a questa ipotesi molto semplice.
CONCETTI CORTI ::
Gli oggetti NON implementano Finalize
metodi, lì la memoria viene recuperata immediatamente, a meno che, ovviamente, non siano più raggiungibili dal
codice dell'applicazione
Oggetti attuazione Finalize
Metodo Il concetto / Applicazione Application Roots
, Finalization Queue
, Freacheable Queue
viene prima che possano essere recuperati.
Qualsiasi oggetto è considerato spazzatura se NON è raggiungibile dal codice dell'applicazione
Assumi :: Classi / Oggetti A, B, D, G, H NON implementano il Finalize
Metodo e C, E, F, I, J implementano il Finalize
Metodo.
Quando un'applicazione crea un nuovo oggetto, il nuovo operatore alloca la memoria dall'heap. Se il tipo di oggetto contiene un Finalize
metodo, un puntatore all'oggetto viene posizionato sulla coda di finalizzazione .
pertanto i puntatori agli oggetti C, E, F, I, J vengono aggiunti alla coda di finalizzazione.
La coda di finalizzazione è una struttura di dati interna controllata dal Garbage Collector. Ogni voce nella coda punta a un oggetto che dovrebbe avere il suo Finalize
metodo chiamato prima che la memoria dell'oggetto possa essere recuperata. La figura seguente mostra un heap contenente diversi oggetti. Alcuni di questi oggetti sono raggiungibili dalle origini dell'applicazionee alcuni non lo sono. Quando sono stati creati gli oggetti C, E, F, I e J, il framework .Net rileva che questi oggetti hanno Finalize
metodi e puntatori a questi oggetti vengono aggiunti alla coda di finalizzazione .
Quando si verifica un GC (1a raccolta), gli oggetti B, E, G, H, I e J vengono determinati come immondizia. Perché A, C, D, F sono ancora raggiungibili dal codice dell'applicazione rappresentato attraverso le frecce dalla casella gialla sopra.
Il garbage collector analizza la coda di finalizzazione alla ricerca di puntatori a questi oggetti. Quando viene trovato un puntatore, il puntatore viene rimosso dalla coda di finalizzazione e aggiunto alla coda freachable ("F-raggiungibile").
La coda freachable è un'altra struttura di dati interna controllata dal Garbage Collector. Ogni puntatore nella coda freachable identifica un oggetto che è pronto per essere Finalize
chiamato il suo metodo.
Dopo la raccolta (1a raccolta), l'heap gestito ha un aspetto simile alla figura seguente. Spiegazione fornita di seguito ::
1.) La memoria occupata dagli oggetti B, G e H è stata recuperata immediatamente perché questi oggetti non avevano un metodo di finalizzazione che doveva essere chiamato .
2.) Tuttavia, la memoria occupata dagli oggetti E, I e J non può essere recuperata perché il loro Finalize
metodo non è stato ancora chiamato.
La chiamata al metodo Finalize viene eseguita dalla coda freacheable.
3.) A, C, D, F sono ancora raggiungibili tramite il codice dell'applicazione rappresentato attraverso le frecce dalla casella gialla sopra, quindi NON verranno raccolti in nessun caso
Esiste uno speciale thread di runtime dedicato alla chiamata dei metodi Finalize. Quando la coda freachable è vuota (che di solito è il caso), questo thread dorme. Ma quando appaiono le voci, questo thread si riattiva, rimuove ogni voce dalla coda e chiama il metodo Finalize di ciascun oggetto. Il garbage collector compatta la memoria recuperabile e lo speciale thread di runtime svuota la coda freachable , eseguendo il Finalize
metodo di ciascun oggetto . Quindi ecco finalmente quando viene eseguito il metodo Finalize
La volta successiva che il garbage collector viene richiamato (2a raccolta), vede che gli oggetti finalizzati sono veramente spazzatura, poiché le radici dell'applicazione non puntano su di essa e la coda freachable non punta più su di essa (è anche VUOTA), quindi il la memoria per gli oggetti (E, I, J) viene semplicemente recuperata da Heap. Vedi la figura sotto e confrontala con la figura appena sopra
La cosa importante da capire qui è che sono richiesti due GC per recuperare la memoria utilizzata dagli oggetti che richiedono la finalizzazione . In realtà, sono necessarie anche più di due collezioni in cabina poiché questi oggetti possono essere promossi a una generazione precedente
NOTA :: La coda freachable è considerata una radice proprio come le variabili globali e statiche sono le radici. Pertanto, se un oggetto si trova nella coda freachable, allora l'oggetto è raggiungibile e non è spazzatura.
Come ultima nota, ricorda che l'applicazione di debug è una cosa, Garbage Collection è un'altra cosa e funziona in modo diverso. Finora non puoi SENTIRE la garbage collection semplicemente eseguendo il debug delle applicazioni, inoltre se desideri investigare Memory inizia qui.