Подтвердить что ты не робот

Как выбрать параметры для GC.RegisterForFullGCNotification?

Если вы хотите получать уведомления 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 правильным выбором, произвольным выбором или как я должен изменить это, чтобы отразить какой-либо конкретный сценарий использования.

Итак: есть ли правильный способ выбора этих чисел? Или это просто пробная ошибка, основанная на том, получаю ли я слишком ранние/поздние события?

4b9b3361

Ответ 1

Лучший ответ, который я мог найти при выборе этих параметров, можно найти в http://assets.red-gate.com/community/books/assets/Under_the_Hood_of_.NET_Management.pdf

Вам может быть интересно узнать о магических константах в призыве к Уведомление RegisterForFullGC. Этот метод принимает два параметра, maxGenerationThreshold и largeObjectHeapThreshold. Оба параметра могут быть целыми числами от 1 до 99. Большие значения для этих параметров приведет к тому, что уведомление будет поднято ранее, а меньшие значения приведет к тому, что уведомление будет поднято ближе к тому, когда событие фактически имеет место.

Первый параметр позволяет указать, что вы хотите получать уведомления о количестве объектов, которые имеют выжил до поколения 2, а второй параметр указывает, что вы хотите получать уведомления о размерах кучи больших объектов. Однако ни один из параметров не указывает абсолютное значение, поэтому 30 для maxGenerationThreshold не подразумевает запуск Уведомление о наличии 30 объектов в поколении 2; это просто означает, что вы хотите получать уведомление раньше, чем если бы вы прошли в значение 10. Если вы специально не заинтересованы в одном триггер над другим, вы можете передать одно и то же значение для каждый параметр, так как это поможет убедиться, что вы получили уведомление на независимо от триггера.

Большее значение даст вам больше времени, чтобы справиться с давлением памяти, но вам просто нужно быть старайтесь не устанавливать слишком высокие значения. Чем выше вы устанавливаете пороговые значения, тем быстрее вы получите уведомление, но дольше вы должны ждать на GC. Играйте с этими параметрами в своем приложении, чтобы увидеть, что работает лучше всего. для вашей нагрузки и типов объектов, потребляющих вашу память.

Таким образом, в ответ на основании вышеизложенного, в основном это пробная версия и ошибка, однако два значения, которые вы используете для каждого параметра, вероятно, будут одинаковыми.