2009-05-06 15 views
5

Ho trovato alcuni grandi articoli (Maoni, Richter #1, Richter #2) dando molti dettagli per quanto riguarda la teoria e la pratica del GC, ma non riesco a trovare nulla che indica come priorità del thread del GC è impostato..NET Garbage Collector: qual è la priorità del thread?

Il più vicino che ho trovato è questo uno che indica che il thread finalizzatori "runs asynchronously to the application and at a high priority."

ho sempre pensato che fosse un filo "bassa priorità", ma leggendo sempre di più a questo proposito che sembra essere sbagliato (dal momento che il GC deve bloccare tutti gli altri thread e non vuoi che la tua app dipenda da un thread con bassa priorità per poterla riprendere in modo tempestivo).

Qualcuno sa per certo di sapere quale dovrebbe essere la priorità effettiva?

risposta

9

In CLR via C#, Richter spiega che:

uno speciale filo CLR ad alta priorità è dedicata a chiamare Finalize metodi

(vedere la sezione "finalizzazione Internals" titolo del capo 20)

Questo è l'unico contesto in cui parla di un thread di garbage collector. Un po 'prima nel capitolo, spiega che la raccolta dei rifiuti viene avviato in risposta ad uno dei seguenti eventi:

  • generazione 0 è pieno
  • Chiama per GC.Collect
  • di Windows sta riportando condizioni di memoria insufficiente
  • Il CLR sta scaricando un AppDomain
  • Il CLR si sta spegnendo

... il che fa pensare che l'unico thread creato dal garbage collector è questo singolo thread di finalizzazione "ad alta priorità".

Edit: Si passa poi, in "Concurrent Collection", per spiegare che:

In un sistema multiprocessore che esegue la versione workstation del motore di esecuzione, il garbage collector ha un thread in background aggiuntivo per raccogliere oggetti contemporaneamente durante l'esecuzione dell'applicazione. [...] Il garbage collector ha un normale thread prioritario in background che contrassegna gli oggetti non raggiungibili.

+0

Questo mi sembra il più vicino possibile a una risposta completa. Lo lascerò aperto un po 'più a lungo, ma penso che questo potrebbe farlo. Grazie! Impara qualcosa di nuovo ogni giorno, eh? Forse dovrei comprare il suo libro. –

+1

Posso sicuramente consigliare il suo libro - sono interessanti informazioni di base, e mi ha salvato su alcuni problemi specifici. –

+0

Penso che questo sia uno di quei rari casi in cui non sono riuscito a trovare la risposta online, ma un libro sembra avere la risposta in dettaglio. Grazie! –

5

Il thread GC viene eseguito con priorità normale. Il thread del finalizzatore funziona con la priorità "Massima".

Si può vedere questo attivando la finestra "Discussione" Debug e interrompendo ovunque in un'applicazione gestita. I thread sono tutti elencati (sebbene non siano nominati), con le loro priorità. Ci vuole un po 'per decifrare quale sia, ma ci sarà un extra thread "Normal" e "Highest", che corrisponde al GC e al thread di Finalizer.

+0

che sembra avere senso (normale per GC, più alto per finalizzatore in modo da tornare indietro senza vedersi superata) . Mi chiedo solo perché non è spiegato esplicitamente da nessuna parte su MSDN. Sei stato in grado di trovare qualcosa di più "formale" di un semplice sparo della finestra Thread? –

+0

Non so nulla di specifico. Ne ho scoperto qualcosa durante un discorso in conferenza di Rico Mariani che parlava di perf. in .NET. Tuttavia, la maggior parte dei documenti MSDN fondamentalmente dice di ignorare gli interni di GC e semplicemente fidarsi di loro - e inoltre non fare affidamento su di essi rimanendo la stessa, perché sono liberi di cambiare in qualsiasi momento (e avere nel passato). –

0

garbage collector viene eseguito con priorità inferiore rispetto discussioni critiche

0

La priorità filo GC è un dettaglio di implementazione, adesso sono in esecuzione in priorità normale, tuttavia il thread finalizzatore viene eseguito come una priorità e ha un timeout pure.

Problemi correlati