如果您想接收 GC 通知(例如,在收集期间在节点之间转移负载),那么您可以使用三个方法,GC.RegisterForFullGCNotification
和GC.WaitForFullGCApproach
-GC.WaitForFullGCComplete
但是,传递给的参数GC.RegisterForFullGCNotification
似乎在很大程度上没有意义,并且没有现实世界的指导给出了如何选择合适的值。有一些模糊的注释,比如从这里:
使用以下准则指定 maxGenerationThreshold 和 largeObjectHeapThreshold 参数:
阈值越大,收集可能发生的时间越远,并且越早发出通知。
较大的阈值为运行时提供了更多机会来检查即将到来的集合。这增加了您收到通知的可能性。但是,您不应将阈值设置得太高,因为这会导致在运行时诱导下一次收集之前等待更长的时间。
当您根据通知使用高阈值自行诱导收集时,回收的对象比运行时的下一个收集回收的对象多。
阈值越小,收集越早发生且通知越晚的可能性越大。
或从这里
maxGenerationThreshold
一个介于 1 和 99 之间的数字,用于指定应根据第 2 代中提升的对象何时引发通知。
largeObjectHeapThreshold
一个介于 1 和 99 之间的数字,用于指定应根据在大对象堆中分配的对象何时引发通知。如果您指定的值太高,您很可能会收到通知,但在运行时导致收集之前等待的时间可能太长。如果您自己诱导一个集合,您可能会回收比在运行时导致该集合时回收的对象更多。
如果您指定的值太低,则运行时可能会在您有足够的时间收到通知之前导致收集。
但是,这并不能真正帮助我选择合理/正确的数字,除了“不太高,也不太低”。
目前,我只是使用少数提供的示例之一,即
// these are magic numbers; nobody really knows what they mean...
GC.RegisterForFullGCNotification(10, 10);
但是......目前还不清楚10
,是否10
是一个正确的选择,一个任意的选择,或者我应该如何改变它以反映任何特定的使用场景。
那么:有没有选择这些数字的正确方法?或者它只是试错,基于我是否太早/太晚得到事件?