Если ваше приложение использует много памяти, это не обязательно означает, что у вас есть утечка памяти. Из информации в вашем вопросе трудно утверждать, что может быть не так.
При устранении неполадок в управляемых утечках памяти с помощью WinDbg я делаю следующее:
Получите обзор использования кучи с помощью !eeheap
(в этом отчете указано использование кучи, а не стека, как вы упомянули - каждый стек имеет размер по умолчанию 1 МБ, поэтому, если вы не изменили это, нет никакого способа вы можете использовать 100 МБ в стеке)
Сделайте !dumpheap -stat
, чтобы узнать, что находится в куче. Скорее всего, если у вас утечка памяти, виновный тип (ы) будет одним из главных потребителей. Чтобы получить представление о том, как развивается использование кучи, вы можете возобновить работу приложения, разбить его чуть позже и повторить команду !dumpheap -stat
.
Если вы найдете какие-либо типы с большим количеством экземпляров, чем вы, кроме, перечислите те, которые используют !dumpheap -mt <MT of type>
. Это перечислит все экземпляры определенного типа. Выберите случайные экземпляры и проверьте корни с помощью команды !gcroot
. Это скажет вам, что поддерживает рассматриваемые экземпляры. Если корня нет, эти экземпляры будут собраны в какой-то момент.
ОБНОВЛЕНИЕ, чтобы ответить на ваши комментарии:
Управляемая куча - это только часть занимаемой памяти управляемой программы. Помните, что приложение .NET на самом деле является приложением внутри другого приложения - хост-процесса, который загружает CLR, который, в свою очередь, загружает ваше приложение. Поэтому, прежде чем ваше приложение начнет использовать какую-либо память, CLR уже заняла справедливую долю. Помимо этого .NET-приложения хранят как код MSIL, так и JIT-скомпилированный код как часть отпечатка. CLR также занимает место для различных вещей бухгалтерии (например, CLR создает два дополнительных AddDomains для внутреннего использования).
Числа, которые вы даете, не кажутся мне слишком высокими, но, поскольку я не знаю вашего заявления, трудно сказать, являются ли они чрезмерными.
100 МБ в управляемой куче может быть хорошо, в зависимости от того, что делает ваше приложение. Ты проверил кучу? И если так, что вы нашли?