Память в мониторе ресурсов не отображается в UMDH

У меня есть служба, которая периодически начинает сжимать память сервера и должна быть перезапущена, чтобы освободить ее. Я перестал работать с gflags, перезапустил службу и начал делать запланированные снимки UMDH. Когда проблема возникла снова, менеджер ресурсов сообщил о нескольких ГБ в разделах "Рабочий набор" и "Частные байты", но моментальные снимки UMDH учитывают только несколько выделенных МБ в кучах процесса.

В верхней части файлов моментальных снимков UMDH упоминается "Только выделения, для которых менеджер кучи собрал стек, сбрасываются".
Как может быть выделение в процессе без трассировки, когда были указаны флаги +ust?

Как я могу узнать, где / как были распределены эти ГБ?

1 ответ

UMDH - сокращение от Кучи дампа в режиме пользователя. Термин "Куча" здесь является ключевым: он относится только к диспетчеру кучи C++. Это означает, что UMDH не отслеживает всю память, выделенную другими средствами, кроме диспетчера кучи C++.

Это может быть

  • прямые звонки VirtualAlloc()
  • память, используемая.NET, поскольку.NET имеет свой собственный менеджер кучи

Но даже для C++ есть случай, когда выделение больше 512 кБ не эффективно управляется диспетчером кучи C++, поэтому он просто перенаправляет его в VirtualAlloc() и не создает сегмент кучи таких больших выделений.

Как я могу узнать, где / как были распределены эти ГБ?

Для прямых звонков на VirtualAlloc(), команда WinDbg !address -summary может дать ответ. Для.NET, расширение SOS и !dumpheap -stat могу дать ответ.

Другие вопросы по тегам