Память в мониторе ресурсов не отображается в 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
могу дать ответ.