FullGC normalmente mette in pausa tutti i thread durante l'esecuzione. Avere due AppDomain, ognuno con diversi thread. Quando GC è in esecuzione, tutti i thread verranno messi in pausa o solo quelli di uno dei due AppDomain?La raccolta dati obsoleti si verifica a livello di processo o livello di dominio?
risposta
Da questo thread qui: Is the garbage collector in .net system-wide or application-wide?, si verifica a livello di processo. Tutti i thread in quel processo verranno messi in pausa ma non tra più processi.
Uno o più domini di app possono esistere all'interno di un processo ma i domini di app non sono condivisi tra i processi. Per: http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx, "tutte le appdomain nel processo condividono lo stesso GC." Di conseguenza, GC dovrebbe interessare tutti i domini delle app quando viene attivato un GC.
Tuttavia, è possibile che si verifichi un calo delle prestazioni della CPU con un numero eccessivo di processi che impiegano tempo a eseguire GC, il che può influire negativamente sulle prestazioni di altri processi non coinvolti in un GC.
Questo legame spiega anche i fondamenti della GC troppo:
difficile rispondere, cosa migliore da fare è solo provarlo:
using System;
using System.Reflection;
public class Program : MarshalByRefObject {
static void Main(string[] args) {
var dummy1 = new object();
var dom = AppDomain.CreateDomain("test");
var obj = (Program)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Program).FullName);
obj.Test();
Console.WriteLine("Primary appdomain, collection count = {0}, gen = {1}",
GC.CollectionCount(0), GC.GetGeneration(dummy1));
Console.ReadKey();
}
public void Test() {
var dummy2 = new object();
for (int test = 0; test < 3; ++test) {
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.WriteLine("In appdomain '{0}', collection count = {1}, gen = {2}",
AppDomain.CurrentDomain.FriendlyName, GC.CollectionCount(0),
GC.GetGeneration(dummy2));
}
}
uscita:
In appdomain 'test', collection count = 3, gen = 2
Primary appdomain, collection count = 3, gen = 2
Buona prova che un GC influisce su tutti gli AppDomain sul CL predefinito R host. Questo mi ha sorpreso.
- 1. Messaggi registro raccolta dati obsoleti
- 2. Perché si verifica questo errore a livello di trasporto?
- 3. Raccolta dati obsoleti durante la compilazione in C
- 4. Determina programmatore di dominio corrente a livello di programmazione
- 5. Importazione Python a livello di funzione VS. Livello modulo
- 6. Numero nel dominio di primo livello?
- 7. Memorizzazione nella cache di basso livello per la raccolta
- 8. Estrai dominio di 2 ° livello dal dominio? - Python
- 9. Quale livello si blocca? A che livello devono essere attivi?
- 10. Oggetto modello DTO o Dominio nel livello Visualizza?
- 11. Determinare Processo Info livello di programmazione a Darwin/OSX
- 12. Livello di accesso ai dati Statico o basato su istanze?
- 13. Dovrebbe essere installato rbenv a livello di sistema o a livello di utente?
- 14. Come disattivare o attivare "Funzionalità Windows" a livello di programmazione
- 15. Le annotazioni a livello del metodo di sicurezza a molla devono essere applicate al livello controller o al livello servizio?
- 16. La raccolta dei dati inutili si verifica immediatamente dopo la chiamata a Hashmap.remove()?
- 17. Copia a livello di blocchi di dati tra streambands
- 18. Verifica la proprietà del dominio
- 19. Crittografia del database o crittografia a livello di applicazione?
- 20. Ottieni il dominio di secondo livello di un URL (java)
- 21. Come si aggiunge UIButton a UIToolBar a livello di programmazione?
- 22. Dati TAP (annotazione) a livello di codice programmabile
- 23. Modifica log4net livello di registrazione a livello di programmazione
- 24. , verificare a livello di programmazione
- 25. Configurazione @Path a livello di classe e livello metodo
- 26. Refactoring livello dati
- 27. Come faccio a controllare a livello di codice per vedere a quale dominio sono connesso?
- 28. Istanze basate su predicato a livello di livello?
- 29. Reindirizza il sottodominio nella cartella del dominio di primo livello
- 30. Convalida a livello di tipo
Sei sicuro che ogni AppDomain abbia il proprio heap? Ciò contraddice la risposta di Brian Rasmussen qui: http://stackoverflow.com/questions/574708/what-is-appdomain e la risposta di Aghilas Yakoub qui: http://stackoverflow.com/questions/12219815/appdomains-and-gc- heap –
"AppDomains fa parte dello stesso processo e quindi condivide lo stesso heap gestito". Non contraddice ciò che hai detto? Vedi anche la mia modifica al mio commento, Aghilas dice "Hai un heap per un processo, e i domini dell'app condividono questo heap." A meno che non sia frainteso, sembra che almeno una risposta (la tua o la loro) abbia bisogno di essere corretta. –
Ok, lo applico. Sono logicamente distinti poiché l'handle dell'oggetto punta a una struttura dati specifica AppDomain. E quindi deve essere eseguito il marshalling tra domini. Ma ci sono prove del test che l'heap GC stesso è condiviso. –