System.GC.RegisterForFullGCNotification 方法
方法描述
指定当条件支持完整垃圾回收以及回收完成时,应引发垃圾回收通知。
语法定义(C# System.GC.RegisterForFullGCNotification 方法 的用法)
public static void RegisterForFullGCNotification( int maxGenerationThreshold, int largeObjectHeapThreshold )
参数/返回值
参数值/返回值 | 参数类型/返回类型 | 参数描述/返回描述 |
---|---|---|
maxGenerationThreshold | System-Int32 | 一个介于 1 和 99 之间的数字,指定根据第 2 代中保留的对象,应何时引发通知。 |
largeObjectHeapThreshold | System-Int32 | 一个介于 1 和 99 之间的数字,指定根据大对象堆中分配的对象,应何时引发通知。 |
返回值 | void |
提示和注释
如果您遇到公共语言运行时引发的完整垃圾回收会对应用程序性能产生不利影响的情况,则您可以确定运行时是否即将引发完整垃圾回收,然后在条件仍支持时,通过自行引发回收(使用 Collect 方法)来避开该回收。 有关哪一内容表示完整垃圾回收的更多信息,请参见垃圾回收通知。
在注册垃圾回收通知时,可以通过检查垃圾回收通知的状态,确定是否已引发表示临近的完整垃圾回收的事件。 此模式与操作系统监视内存不足通知的方式类似。
使用以下准则来指定 maxGenerationThreshold 和 largeObjectHeapThreshold 参数:
阈值越大,可能发生回收的时间就越晚,引发通知的时间就越早。
阈值越大,运行时检查临近的回收的机会就越多。 这将增加您收到通知的可能性。 但是,不应将阈值设置得过高,因为那样会导致运行时需等待较长的时间才能引发下次回收。
当您使用高阈值在收到通知时自行引发回收时,所回收的对象将比运行时的下次回收所回收的对象多。
阈值越小,较早发生回收的可能性就越大,引发通知的时间就越晚。
System.GC.RegisterForFullGCNotification 方法例子
此代码示例摘自为垃圾回收通知主题提供的一个更大示例。
// 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 Listload = new List (); 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); } }
异常
异常 | 异常描述 |
---|---|
InvalidOperationException | 此成员在启用并发垃圾回收时不可用。 有关如何禁用并发垃圾回收的信息,请参见 |
ArgumentOutOfRangeException | maxGenerationThreshold 或 largeObjectHeapThreshold 不在 1 和 99 之间。 |
版本信息
.NET Framework 受以下版本支持:4、3.5 SP1、3.0 SP2、2.0 SP2 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1
适用平台
Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。