Есть ли событие, когда сборка мусора происходит в .NET?

У меня странное замедление на моем веб-сайте ASP.NET, которое я не могу отслеживать. Я подозреваю, что GC может зайти и остановить мои потоки. Чтобы точно знать, было бы неплохо регистрироваться каждый раз, когда GC происходит.

Я мог бы создать фиктивный объект и выполнить регистрацию в своем финализаторе, но тогда это будет одноразовое решение, в то время как в моем случае существует несколько таких необъяснимых пауз.

Любые идеи?

Добавлено: Среда - это VS2008/.NET 3.5 SP1. И нет, Уведомления о сборе мусора не будут делать, потому что они являются методом опроса и не работают для параллельного GC.

Ответы

Ответ 1

Вот простой трюк. Он может быть не на 100% точным, но, вероятно, он будет достаточно хорошим.

Если вы можете жить с уведомлением о завершении, то есть простой метод, который вы можете использовать.

Создайте объект и не держите ссылку на него. Когда объект завершен, вы поднимите свое событие и затем создаете другой объект. Вы также не держите ссылку на этот объект, но он будет жить до следующего раза, когда будет выполнена достаточно полная коллекция.

Вот такой объект:

public class GCNotifier
{
    public static event EventHandler GarbageCollected;

    ~GCNotifier()
    {
        if (Environment.HasShutdownStarted)
            return;
        if (AppDomain.CurrentDomain.IsFinalizingForUnload())
            return;
        new GCNotifier();
        if (GarbageCollected != null)
            GarbageCollected(null, EventArgs.Empty);
    }

    public void Start()
    {
        new GCNotifier();
    }
}

Если вы хотите, вы можете добавить поддержку для его остановки, имея статическое логическое поле, которое не позволяет ему перезагрузиться после следующей финализации.

Надеюсь, это поможет.

Ответ 2

Perhpas эта статья (Уведомления о сборе мусора) поможет.

вы можете получать уведомления о том, что полная сборка мусора приближается к

Ответ 3

Вы контролируете perf-mon? Вы можете наблюдать за процессором - в целом и по процессам, в .NET-памяти, включая размер каждого из поколений и количество типов GC. Вы также можете позволить программе perf-mon работать и регистрироваться в течение продолжительного периода времени, чтобы посмотреть тенденции. Я считаю, что это гораздо более полезно, чем дискретное "это происходит прямо сейчас!" события.

Ответ 4

Простой ответ: "Нет, нет событий GC" только функция GCNotification ". Однако вы создаете класс-оболочку, который будет прослушивать GCNotification, и эта оболочка может запускать события, но нет простого решения для событий, которое вы ищете.

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

Ответ 5

Вы можете прочитать эту статью в Мониторинг производительности ASP.NET и когда предупреждать администраторов

Он включает раздел о GCcounters для просмотра и значений значений. Например

% Время в GC. Процент времени потратил на выполнение последнего мусора коллекция. Среднее значение 5% или менее считалось бы здоровым, но шипы больше, чем это не редкость. Обратите внимание, что все потоки приостановлено во время сбора мусора.

Вы также можете посмотреть блог Если это сломано, исправьте его, вы должны Он имеет ряд тематических исследований которые идут шаг за шагом о том, как определить конкретную проблему. Например Пример ASP.NET: высокий процессор в GC - большие объекты и высокие ставки распределения