GC.RegisterForFullGCNotification (Método)
Actualización: Julio de 2008
Especifica que debe emitirse una notificación de recolección de elementos no utilizados cuando las condiciones favorecen la recolección completa de elementos no utilizados y cuando se ha completado la recolección.
Ensamblado: mscorlib (en mscorlib.dll)
[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] public static void RegisterForFullGCNotification( int maxGenerationThreshold, int largeObjectHeapThreshold )
/** @attribute PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust") */ public static void RegisterForFullGCNotification( int maxGenerationThreshold, int largeObjectHeapThreshold )
public static function RegisterForFullGCNotification( maxGenerationThreshold : int, largeObjectHeapThreshold : int )
Parámetros
- maxGenerationThreshold
- Tipo: System.Int32
Número comprendido entre 1 y 99 que especifica cuándo debe emitirse la notificación basándose en los objetos supervivientes de la generación 2.
- largeObjectHeapThreshold
- Tipo: System.Int32
Número comprendido entre 1 y 99 que especifica cuándo debe emitirse la notificación basándose en los objetos asignados en el montón de objetos grandes.
| Excepción | Condición |
|---|---|
| InvalidOperationException | Este miembro no está disponible cuando está habilitada la recolección simultánea de elementos no utilizados. Para obtener información sobre la forma de deshabilitar la recolección simultánea de elementos no utilizados, vea el valor de tiempo de ejecución <gcConcurrent>. |
| InvalidOperationException | maxGenerationThreshold o largeObjectHeapThreshold no está comprendido entre 1 y 99. |
Si se enfrenta a situaciones en las que una recolección completa de elementos no utilizados por parte de Common Language Runtime afectaría negativamente al rendimiento de su aplicación, puede determinar si el tiempo de ejecución está a punto de inducir una recolección completa de elementos no utilizados y eludir esa recolección induciendo una recolección usted mismo (mediante el método Collect) cuando las condiciones todavía sean favorables. Para obtener más información sobre lo que representa una recolección completa de elementos no utilizados, vea Notificaciones de recolección de elementos no utilizados.
Al registrarse para una notificación de recolección de elementos no utilizados, puede determinar si se ha provocado el evento que indica una próxima recolección completa de elementos no utilizados comprobando el estado de la notificación de recolección de elementos no utilizados. Este modelo se parece al modo en que el sistema operativo supervisa las notificaciones de memoria insuficiente.
Utilice las instrucciones siguientes para especificar los parámetros largeObjectHeapThreshold y maxGenerationThreshold:
Cuanto mayor sea el valor de umbral, más tiempo tardará en producirse la recolección y antes se emitirá la notificación.
Un valor de umbral mayor proporciona más oportunidades para que el tiempo de ejecución compruebe una recolección próxima. Esto aumenta la probabilidad de que reciba una notificación. Sin embargo, no debería establecer el umbral en un valor demasiado elevado porque se producirá una espera más larga antes de que el tiempo de ejecución induzca la siguiente recolección.
Al inducir una recolección usted mismo tras recibir la notificación utilizando un valor de umbral elevado, se reclaman más objetos de los que se reclamarían en la siguiente recolección del motor en tiempo de ejecución.
Cuanto menor sea el valor de umbral, mayor será la probabilidad de que una recolección se produzca antes y la notificación se emitirá después.
En el ejemplo siguiente se muestra cómo registrar una notificación de recolección de elementos no utilizados e iniciar un subproceso para supervisar el estado de la notificación de recolección de elementos no utilizados. Este ejemplo de código forma parte de un ejemplo más extenso que aparece en el tema Notificaciones de recolección de elementos no utilizados.
// Variable for continual checking in the // While loop in the WaitForFullGCProc method. static bool checkForNotify = false; // Variable for suspending work // (such servicing allocated server requests) // after a notification is received and then // resuming allocation after inducing a garbage collection. static bool bAllocate = false; // Variable for ending the example. static bool finalExit = false; // Collection for objects that // simulate the server request workload. static List<byte[]> load = new List<byte[]>(); public static void Main(string[] args) { try { // Register for a notification. GC.RegisterForFullGCNotification(10, 10); Console.WriteLine("Registered for GC notification."); checkForNotify = true; bAllocate = true; // Start a thread using WaitForFullGCProc. Thread thWaitForFullGC = new Thread(new ThreadStart(WaitForFullGCProc)); thWaitForFullGC.Start(); // While the thread is checking for notifications in // WaitForFullGCProc, create objects to simulate a server workload. try { int lastCollCount = 0; int newCollCount = 0; while (true) { if (bAllocate) { load.Add(new byte[1000]); newCollCount = GC.CollectionCount(2); if (newCollCount != lastCollCount) { // Show collection count when it increases: Console.WriteLine("Gen 2 collection count: {0}", GC.CollectionCount(2).ToString()); lastCollCount = newCollCount; } // For ending the example (arbitrary). if (newCollCount == 500) { finalExit = true; checkForNotify = false; break; } } } } catch (OutOfMemoryException) { Console.WriteLine("Out of memory."); } finalExit = true; checkForNotify = false; GC.CancelFullGCNotification(); } catch (InvalidOperationException invalidOp) { Console.WriteLine("GC Notifications are not supported while concurrent GC is enabled.\n" + invalidOp.Message); } }
- LinkDemand
para plena confianza del llamador inmediato. Este miembro no puede ser utilizado por código de confianza parcial.
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.