urbanos universidades tesis solidos residuos reciclables manejo importancia gestion disposicion desechos clasificacion .net garbage-collection

.net - universidades - ¿La recolección de basura se realiza a nivel de proceso o nivel de dominio de aplicación?



residuos solidos reciclables (2)

De este hilo aquí: ¿El recolector de basura en .net para todo el sistema o para toda la aplicación? , se produce en el nivel de proceso. Todos los subprocesos en ese proceso se detendrán, pero no en varios procesos.

Uno o varios dominios de aplicación pueden existir dentro de un proceso, pero los dominios de aplicación no se comparten entre procesos. Por: http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx , "todas las aplicaciones se mantienen en el proceso Comparte el mismo GC ". En consecuencia, GC debe afectar a todos los dominios de aplicaciones cuando se activa un GC.

Sin embargo, puede ocurrir un impacto en el rendimiento de la CPU con demasiados procesos que invierten tiempo en hacer GC, lo que puede afectar negativamente el rendimiento de otros procesos que no participan en un GC.

Este enlace también explica los fundamentos de GC también:

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

FullGC normalmente detiene todos los subprocesos mientras se ejecuta. Teniendo dos AppDomains, cada uno ejecutando varios hilos. Cuando se ejecuta GC, ¿se detendrán todos los subprocesos, o solo los de uno de los dominios de aplicaciones?


Difícil de responder, lo mejor que puedes hacer es probarlo:

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)); } }

Salida:

In appdomain ''test'', collection count = 3, gen = 2 Primary appdomain, collection count = 3, gen = 2

Buena evidencia de que un GC afecta a todos los dominios de aplicación en el host CLR predeterminado. Esto me sorprendió.