2013-10-22 18 views

risposta

8

Risposta breve:

Quando un filo ha terminato il suo processo, se non altro contiene un riferimento ad esso, il garbage collector disporne automaticamente.

lungo Risposta:

Dopo il garbage collector viene inizializzata dal CLR, si assegna un segmento di memoria per archiviare e gestire gli oggetti. Questa memoria è denominata l'heap gestito, a differenza di un heap nativo nel sistema operativo. Esiste un heap gestito per ogni processo gestito.

Tutti i thread nel processo allocano memoria per oggetti nello stesso heap. Per prenotare la memoria , il garbage collector chiama la funzione Win32 VirtualAlloc, e riserva un segmento di memoria alla volta per le applicazioni gestite. Il garbage collector, inoltre, riserva i segmenti in base alle esigenze e rilascia i segmenti sul sistema operativo (dopo averli cancellati da qualsiasi oggetto chiamando la funzione Win32 VirtualFree. Il minor numero di oggetti allocati nell'heap, minore è il lavoro che deve svolgere il garbage collector. Quando si assegnano oggetti, non utilizzare valori arrotondati superiori alle esigenze, ad esempio l'assegnazione di un array di 32 byte quando sono necessari solo 15 byte. Quando viene attivata una raccolta dati inutili, il programma di raccolta dati obsoleti recupera la memoria che è occupata da oggetti morti.

I compatti processo bonifica vivono oggetti in modo che siano spostati insieme, e lo spazio morto viene rimosso, rendendo il mucchio più piccolo. Ciò garantisce che gli oggetti allocati insieme rimangano insieme nell'heap gestito, per preservare la loro località. L'invadenza (frequenza e durata) delle raccolte di dati inutili è il risultato del volume di allocazioni e la quantità di memoria sopravvissuta nell'heap gestito. L'heap può essere considerato come l'accumulo di due heap: : l'heap di oggetti di grandi dimensioni e l'heap di oggetti di piccole dimensioni. L'ampio heap di oggetti contiene oggetti molto grandi che sono 85.000 byte e più grandi. Gli oggetti sull'heap di oggetti di grandi dimensioni sono in genere matrici. È raro che un oggetto istanza sia estremamente grande.

Riferimento

http://msdn.microsoft.com/en-us/library/ee787088.aspx

1

Secondo this answer, "dopo il codice del thread termina l'esecuzione, il thread verrà interrotta e le sue risorse recuperato."

4

Da here: -

Un gestita la vita di filo è indipendente l'oggetto Thread che crea, una cosa molto buona dato che non si desidera che il GC ad terminare un filo che era funziona ancora semplicemente perché hai perso tutti i riferimenti all'oggetto Thread associato Quindi il GC è che raccoglie l'oggetto Thread ma non il thread gestito reale. .............. ....

Il thread gestito non esce (e la memoria per lo stack di thread non viene rilasciata) finché non viene restituito ThreadProc o è esplicitamente ucciso. Quindi, se un thread gestito non viene terminato correttamente, la memoria allocata al proprio stack di thread perde.

+1

Credo che il fraseggio chiave sia alla fine di quel paragrafo: "* Il thread gestito non esce (e la memoria per lo stack di thread non viene rilasciata) finché non viene restituito ThreadProc o viene esplicitamente ucciso. * *** Quindi, se un thread gestito non è terminato correttamente, la memoria allocata al suo stack di thread perde. *** "Così come si afferma correttamente, è * NON * ripulito quando l'oggetto' Thread' esce da scope, ma piuttosto quando esce 'ThreadProc'. – RBarryYoung

+0

@RBarryYoung: - Sì. Aggiornato quello nella risposta! Grazie! :) –

Problemi correlati