Утечка памяти - любые догадки, где это может быть

Я работаю над проектом .Net (служба Windows), и я обнаружил утечку памяти. Используя профилировщик памяти ANTS, я определил - основная причина находится в области неуправляемой памяти. Но я не использую ни COM / COM +, ни p / invoke - чистый .Net (DataAcces - Fluent nHibernate, Automapper, WCF) ..

Гипотетически, в чем может быть причина? Как мне найти узкое место .. Меня интересует любой опыт, кто сталкивался и решал такие проблемы

Немного подробнее:

  • Я знаю, как утилизируют предметы (и делаю это правильно)
  • Я (почти) не использую события
  • Я использую таймеры
  • Я использую многопоточность (но это скорее параллелизм)
  • Мое приложение не имеет состояния - я отслеживаю объекты в течение их жизненного цикла.

person Andriy Zakharko    schedule 11.05.2012    source источник
comment
Я не знал, что с C # может возникнуть утечка памяти. Разве это не сборка мусора? Вы используете небезопасный код?   -  person Rasmus Søborg    schedule 12.05.2012
comment
@dotTutorials GC идет только так далеко, но да, вы можете создавать утечки памяти.   -  person Jason Meckley    schedule 12.05.2012
comment
Вы, безусловно, можете, сообщения Microsoft по этому поводу просто плохи для обучения разработчиков.   -  person Dene B    schedule 12.05.2012
comment
Вы должны использовать профилировщик памяти.   -  person meziantou    schedule 12.05.2012
comment
Согласно профилировщику памяти ANTS, управляемая куча в порядке - у меня увеличивается неуправляемая память   -  person Andriy Zakharko    schedule 12.05.2012
comment
@meziantou - как тот из ANTS?   -  person Henk Holterman    schedule 12.05.2012
comment
Один только контекст того, что делает ваша служба, был бы полезен. Можете ли вы определить в приложении фазу парковки мяча, где, по вашему мнению, это могло произойти?   -  person Dene B    schedule 12.05.2012
comment
Да, у меня есть некоторые мысли, где это может произойти. К сожалению (для своего проекта) я в настоящее время в отпуске, но по мере его завершения я предоставлю результаты своего расследования как еще один случай возможной утечки памяти.   -  person Andriy Zakharko    schedule 12.05.2012


Ответы (1)


Об утечках памяти

Как правило, утечки разговорной памяти все еще могут существовать в .net. (В некотором роде, не все из них являются утечками памяти из учебников как таковые) Как и в случае с застреванием в сборке мусора поколения 2 или когда не удаляются объекты, наследуемые от IDisposable, или, если на то пошло, потоки, события, соединения SQL, которые остаются открытыми и возиться с пулом соединений. Хотя я не являюсь экспертом в этом вопросе, я укажу вам несколько мест, которые могут помочь вам в ваших поисках.

Пока вы занимаетесь этим, изучение того, как работает сборка мусора, очень помогает в такого рода endevor. Начните с чего-нибудь вроде Основы сборки мусора, чтобы получить общую мысленную картину что, черт возьми, происходит со всей этой магией .NET за кулисами.

О материалах COM

В .NET есть много вещей, которые являются просто оболочками com и / или win32, вызывающими PInvoke за кулисами. Если вы хотите запачкаться и испачкаться внутренностями, то я бы порекомендовал вам взглянуть на декомпилятор (например, IL Spy), где вы подозреваете утечку кода.

Проверьте это для более глубокого обсуждения всего, что связано с оболочкой.
Является ли .NET оболочкой для Win32?

person Terrance    schedule 11.05.2012