Если вы хотите получать уведомления GC (например, для передачи нагрузки между узлами во время сбора), вы можете использовать трио методов GC.RegisterForFullGCNotification
, GC.WaitForFullGCApproach
и GC.WaitForFullGCComplete
- однако параметры, переданные GC.RegisterForFullGCNotification
кажутся в значительной степени бессмысленными, и никакое реальное мировое руководство не дано о том, как выбрать подходящие ценности. Есть неопределенные примечания, например отсюда:
Используйте следующие рекомендации для указания maxGenerationThreshold и largeObjectHeapThreshold:
Чем больше пороговое значение, тем дальше вероятно, произойдет, и чем скорее будет уведомление поднят.
Более высокое пороговое значение предоставляет больше возможностей для среды выполнения для проверки приближающейся коллекции. Это увеличивает вероятность что вы будете уведомлены. Однако вы не должны устанавливать порог слишком высока, потому что это приводит к более длительному ожиданию перед временем выполнения вызывает следующую коллекцию.
Когда вы вызываете сбор непосредственно при уведомлении, используя высокий пороговое значение, больше объектов рекультивируется, чем будет исправлено время выполнения следующей коллекции.
Чем меньше пороговое значение, тем больше вероятность того, что сбор произойдет раньше, и уведомление будет поднято позже.
или отсюда
maxGenerationThreshold
Число от 1 до 99, которое указывает, когда уведомление должно быть поднято на основе объектов, продвигаемых в поколение 2.
largeObjectHeapThreshold
Число от 1 до 99, что указывает, когда уведомление должно быть поднято на основе объектов которые выделяются в кучу большого объекта.Если вы укажете значение что слишком велико, существует высокая вероятность того, что вы получите уведомление, но это может быть слишком длительным периодом ожидания до runtime вызывает сбор. Если вы сами создаете коллекцию, вы может вернуть больше объектов, чем было бы исправлено, если время выполнения коллекции.
Если вы укажете слишком низкое значение, среда выполнения может вызвать прежде чем у вас будет достаточно времени для уведомления.
Однако это не помогает мне выбирать разумные/правильные числа, кроме "не слишком высокого, не слишком низкого".
В настоящее время я просто использую один из немногих приведенных примеров, т.е.
// these are magic numbers; nobody really knows what they mean...
GC.RegisterForFullGCNotification(10, 10);
но... очень неясно, является ли 10
, 10
правильным выбором, произвольным выбором или как я должен изменить это, чтобы отразить какой-либо конкретный сценарий использования.
Итак: есть ли правильный способ выбора этих чисел? Или это просто пробная ошибка, основанная на том, получаю ли я слишком ранние/поздние события?