2015-03-23 3 views
25

Il garbage collector inizia in un processo separato?Il garbage collector è in esecuzione in un processo separato?

Ad esempio:

  1. Se cerchiamo di misurare il tempo di processo presa da alcuni pezzi di codice e durante questo collettore immondizia comincia raccolta, avrà inizio un nuovo processo o nello stesso processo?

  2. Funziona come il seguente?

    //Code (Process 1) 
    --> Garbage Collector Run (Process 1) 
    //Code (Process 1) 
    

    O in questo modo?

    //Code (Process 1) 
    --> Garbage Collector Run (Process 2) 
    //Code (Process 1) 
    
+2

sono abbastanza sicuro funziona nello stesso processo, nella stessa discussione che sta eseguendo un'assegnazione, ma non ho prove per supportare la mia affermazione. Solo il mio buon senso. –

+3

La mia scommessa - stesso processo, poiché altrimenti os impedirebbe di gestire un'altra memoria di processo. – ren

+0

Non sono sicuro perché per me penso che sia eseguito in un processo diverso https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx ma è necessario essere certi di – Omega

risposta

30

Il garbage collector corre il filo che ha attivato garbage collection, sullo stesso processo. Interrompe tutto il thread corrente e si esegue da solo. Di certo non avvia un altro processo, lo avresti visto in Windows.

Da MSDN:

Prima una garbage collection inizia, tutte le discussioni gestite sono sospesi tranne per il filo che ha attivato la raccolta dei rifiuti.

(Questo vale solo per le workstation, come indicato da DrKoch). I server hanno un thread in background in esecuzione per la garbage collection.

Se si ricerca nella documentazione di riferimento per "Concurrent garbage collection", verrà visualizzato il testo "Thread GC", che supporta questo.

È possibile forzare l'esecuzione della raccolta di garabage in un thread separato, se lo si desidera. Mettete questo nella vostra app.config:

<configuration> 
    <runtime> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 

(da this answer)

visualizzato anche The .NET Framework 4.5 includes new garbage collector enhancements for client and server apps, come suggerito da Adam Houldsworth, cambiamenti nel modo in cui il garbage collector lavora dal .NET 4.5.

+1

Questo è vero solo su una "Workstation". – DrKoch

+0

Quindi il loro è un modo per sapere quanto tempo viene impiegato dal garbage collector durante un processo? – Omega

+0

@DrKoch: Grazie. Modificato la mia risposta. +1 a te. –

9

Innanzitutto c'è una distinzione tra processo e thread. Come indicato da @CodesInChaos, ogni processo ha il proprio spazio di indirizzo, quindi eseguire GC in un processo separato non ha senso.

Se parliamo di discussioni: c'è una differenza tra "Workstation" e "Server".Su una stazione di lavoro che gira su uno dei thread utente:

La collezione si verifica sul thread utente che ha attivato la raccolta dei rifiuti

In un server che venga eseguito in separati, le discussioni dedicate:

La raccolta avviene su più thread dedicati che vengono eseguiti al livello di priorità THREAD_PRIORITY_HIGHEST.

Se la macchina è considerato un "server" dipende dalla configurazione:

<gcServer> elemento dello schema di configurazione runtime

Vedere Fundamentals of Garbage Collection

+2

Puoi aggiungere l'URL corretto a 'Fundamentals of Garbage Collection'? –

+1

Fatto. Grazie per aver segnalato – DrKoch

+0

Quindi il loro è un modo per sapere quanto tempo viene impiegato dal garbage collector durante un processo? – Omega