30

如果您想接收 GC 通知(例如,在收集期间在节点之间转移负载),那么您可以使用三个方法,GC.RegisterForFullGCNotificationGC.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是一个正确的选择,一个任意的选择,或者我应该如何改变它以反映任何特定的使用场景。

那么:有没有选择这些数字的正确方法?或者它只是试错,基于我是否太早/太晚得到事件?

4

1 回答 1

11

我可以在选择这些参数时找到的最佳答案可以在http://assets.red-gate.com/community/books/assets/Under_the_Hood_of_.NET_Management.pdf中找到

您可能想知道调用 RegisterForFullGC Notification 中的魔术常量。这个方法有两个参数,maxGenerationThreshold 和 largeObjectHeapThreshold。这两个参数都可以是 1 到 99 之间的整数。这些参数的较大值将导致更早引发通知,而较小值将导致更接近事件实际发生时引发通知。

第一个参数允许您指定要根据存活到第 2 代的对象数量来通知您,第二个参数指定您要根据大对象堆的大小​​来通知您。但是,这两个参数都没有指定绝对值,因此为 maxGenerationThreshold 传入 30 并不意味着在第 2 代中有 30 个对象时触发通知;它只是意味着您希望在传递值 10 之前得到通知。除非您对一个触发器比另一个触发器更感兴趣,否则您可能希望为每个参数传递相同的值,因为这将帮助确保您在同一阶段收到通知,无论触发因素如何。

较大的值会给您更多时间来处理内存压力,但您只需要注意不要将其设置得太高。您设置的阈值越高,您收到通知的速度就越快,但您在 GC 上等待的时间就越长。在您的应用程序中使用这些参数,以查看最适合您的负载和消耗内存的对象类型。

因此,作为回答,基于上述内容,这在很大程度上是反复试验,但是您为每个参数使用的两个值可能是相同的。

于 2012-10-22T01:51:20.873 回答