如果您想接收GC通知(例如,在收集期间在节点之间传输负载),那么您可以使用三个方法GC.RegisterForFullGCNotification
,GC.WaitForFullGCApproach
和GC.WaitForFullGCComplete
- 但是,传递给GC.RegisterForFullGCNotification
的参数似乎在很大程度上没有意义,并且没有给出关于如何选择合适值的真实世界指导。有一些模糊的笔记,如from here:
使用以下准则指定maxGenerationThreshold 和largeObjectHeapThreshold参数:
阈值越大,时间越远 收集可能会发生,通知会越快 提高。
较大的阈值为运行时提供了更多机会 检查即将到来的收藏品。这增加了可能性 你会收到通知。但是,您不应设置阈值 太高,因为这导致在运行时之前等待更长时间 诱导下一个系列。
当你使用高音通知自己诱导收集时 阈值,回收的对象多于回收的对象 运行时的下一个集合。
阈值越小,a的可能性越大 收集将更快发生,并将提出通知 后面。
maxGenerationThreshold
介于1和99之间的数字,指定何时 应该根据提升的对象引发通知 第二代。
largeObjectHeapThreshold
1到99之间的数字 指定何时应根据对象引发通知 在大对象堆中分配的。如果指定值 太高了,你很有可能会得到一个 通知,但在等待之前可能需要等待太长时间 运行时导致集合。如果你自己诱导收藏,你 可以回收比运行时导致的回收更多的对象 集合。
如果指定的值太低,运行时可能会导致 在你有足够的时间收到通知之前收集。
然而,这并没有真正帮助我选择合理/正确的数字,除了“不太高,不太低”。
目前,我只是使用少数提供的例子之一,即
// these are magic numbers; nobody really knows what they mean...
GC.RegisterForFullGCNotification(10, 10);
但是......目前还不清楚10
,10
是正确的选择,是一种随意的选择,或者我应该如何改变它以反映任何特定的使用场景。
那么:有没有正确的方式来选择这些数字?或者它只是反复试验,取决于我是否过早/迟到了事件?
答案 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的时间越长。 在您的应用程序中使用这些参数来查看最佳效果 为你的负荷和消耗你记忆的物体类型。
所以回答一下,基于上面的说法,它主要是反复试验,但是你对每个参数使用的两个值可能是相同的。