2016-04-21 15 views
0

У меня есть служба, которая с течением времени начинает собирать память сервера, и ее необходимо перезапустить, чтобы освободить ее. Я повернул + ust с gflags, перезапустил службу и начал делать запланированные снимки UMDH. Когда проблема повторилась, диспетчер ресурсов сообщил о нескольких GB в разделе «Рабочий набор» и «Частные байты», но учетная запись моментальных копий UMDH предназначена только для нескольких распределений MB в процессе «кучи».Память, о которой сообщается в Мониторе ресурсов, не отображается в UMDH

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

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

ответ

0

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^