如何为GC.RegisterForFullGCNotification选择参数?

时间:2012-09-13 10:09:41

标签: .net garbage-collection

如果您想接收GC通知(例如,在收集期间在节点之间传输负载),那么您可以使用三个方法GC.RegisterForFullGCNotificationGC.WaitForFullGCApproachGC.WaitForFullGCComplete - 但是,传递给GC.RegisterForFullGCNotification的参数似乎在很大程度上没有意义,并且没有给出关于如何选择合适值的真实世界指导。有一些模糊的笔记,如from here

  

使用以下准则指定maxGenerationThreshold   和largeObjectHeapThreshold参数:

     

阈值越大,时间越远   收集可能会发生,通知会越快   提高。

     

较大的阈值为运行时提供了更多机会   检查即将到来的收藏品。这增加了可能性   你会收到通知。但是,您不应设置阈值   太高,因为这导致在运行时之前等待更长时间   诱导下一个系列。

     

当你使用高音通知自己诱导收集时   阈值,回收的对象多于回收的对象   运行时的下一个集合。

     

阈值越小,a的可能性越大   收集将更快发生,并将提出通知   后面。

from here

  

maxGenerationThreshold介于1和99之间的数字,指定何时   应该根据提升的对象引发通知   第二代。

     

largeObjectHeapThreshold 1到99之间的数字   指定何时应根据对象引发通知   在大对象堆中分配的。

     

如果指定值   太高了,你很有可能会得到一个   通知,但在等待之前可能需要等待太长时间   运行时导致集合。如果你自己诱导收藏,你   可以回收比运行时导致的回收更多的对象   集合。

     

如果指定的值太低,运行时可能会导致   在你有足够的时间收到通知之前收集。

然而,这并没有真正帮助我选择合理/正确的数字,除了“不太高,不太低”。

目前,我只是使用少数提供的例子之一,即

// these are magic numbers; nobody really knows what they mean...
GC.RegisterForFullGCNotification(10, 10);

但是......目前还不清楚1010是正确的选择,是一种随意的选择,或者我应该如何改变它以反映任何特定的使用场景。

那么:有没有正确的方式来选择这些数字?或者它只是反复试验,取决于我是否过早/迟到了事件?

1 个答案:

答案 0 :(得分:9)

我可以在http://assets.red-gate.com/community/books/assets/Under_the_Hood_of_.NET_Management.pdf

中找到有关选择这些参数的最佳答案
  

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

第一个参数允许您指定   您希望根据具有的对象数通知您   幸存到第2代,第二个参数指定你   希望根据大对象堆的大小​​得到通知。   但是,两个参数都没有指定绝对值,因此传入   30为maxGenerationThreshold并不意味着触发a   第2代中有30个对象时的通知;它很简单   意味着您希望在通过之前获得通知   值10.除非你对一个人特别感兴趣   触发另一个,你可能想传入相同的值   每个参数,因为这将有助于确保您收到通知   同一阶段,无论触发器如何。

更大的价值会给你   更多的时间来应对记忆压力,但你只需要   小心不要设得太高。设置阈值越高,   您得到通知的速度越快,但您必须等待GC的时间越长。   在您的应用程序中使用这些参数来查看最佳效果   为你的负荷和消耗你记忆的物体类型。

所以回答一下,基于上面的说法,它主要是反复试验,但是你对每个参数使用的两个值可能是相同的。