Какой счетчик можно использовать в мониторе производительности, чтобы увидеть, сколько памяти ожидает GC? - PullRequest
2 голосов
/ 29 января 2010

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

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

Ответы [ 2 ]

2 голосов
/ 29 января 2010

На самом деле ничто в машине действительно не знает, что ожидает сборки мусора: сборка мусора - это как раз процесс выяснения этого и освобождения памяти, соответствующей мертвым объектам. В лучшем случае GC будет иметь эту информацию только о некоторых очень специфических моментах в своем цикле. Части обнаружения и выпуска часто чередуются (это зависит от технологии GC), поэтому возможно, что GC никогда не будет иметь полного подсчета того, что может быть освобождено.

Для большинства GC получение такой информации требует больших вычислительных ресурсов. Если вы готовы потратить немного процессорного времени на него (оно не будет прозрачным для приложения), то вы можете использовать GC.Collect(), чтобы принудительно запустить GC, после чего сразу же следует вызов GC.GetTotalMemory(), чтобы узнать, сколько память пережила ГК. Обратите внимание, что форсирование GC может вызвать заметную паузу, а также может снизить общую производительность.

Это «самодельный» метод; для более серьезного анализа попробуйте специальный профилировщик.

2 голосов
/ 29 января 2010

Лучший способ, которым я смог профилировать память - это использовать ANTS Profiler из RedGate . Вы можете просмотреть снимок, на какой стадии жизненного цикла он находится и многое другое. Включая фактические значения объекта.

...