Анатомия "утечки памяти" - PullRequest
       103

Анатомия "утечки памяти"

168 голосов
/ 01 августа 2008

В перспективе .NET:

  • Что такое утечка памяти ?
  • Как вы можете определить, протекает ли ваше приложение? Каковы эффекты?
  • Как можно предотвратить утечку памяти?
  • Если ваше приложение имеет утечку памяти, оно исчезает, когда процесс завершается или уничтожается? Или утечки памяти в вашем приложении влияют на другие процессы в системе даже после завершения процесса?
  • А как насчет неуправляемого кода, доступного через COM Interop и / или P / Invoke?

Ответы [ 15 ]

9 голосов
/ 04 августа 2008

Все утечки памяти устраняются завершением программы.

Утечка достаточной памяти, и операционная система может решить проблему от вашего имени.

8 голосов
/ 01 августа 2008

Я согласен с Бернардом в том, что в .net будет утечка памяти.

Вы могли бы профилировать свое приложение, чтобы видеть использование его памяти, и определить, что, если оно управляет большим количеством памяти, когда это не должно быть, вы могли бы сказать, что имеет утечку.

В управляемых терминах я положу свою шею на линию, чтобы сказать, что она исчезнет, ​​как только процесс будет убит / удален.

Неуправляемый код - это его собственный зверь, и если в нем есть утечка, он будет следовать стандартному мем. определение утечки.

7 голосов
/ 07 августа 2008

Также имейте в виду, что .NET имеет две кучи, одна из которых является кучей больших объектов. Я полагаю, что в эту кучу помещаются объекты размером примерно 85 КБ или больше. Эта куча имеет другие правила жизни, чем обычная куча.

Если вы создаете большие структуры памяти (словарь или список), было бы разумно поискать точные правила.

Что касается восстановления памяти при завершении процесса, если только вы не используете Win98 или ее эквивалент, все возвращается к ОС после завершения. Единственными исключениями являются вещи, которые открыты кросс-процессами, а у другого процесса ресурс все еще открыт.

COM-объекты могут быть сложными, хотя. Если вы всегда используете шаблон IDispose, вы будете в безопасности. Но я столкнулся с несколькими сборками взаимодействия, которые реализуют IDispose. Ключевым моментом здесь является вызов Marshal.ReleaseCOMObject, когда вы закончите с этим. COM-объекты все еще используют стандартный подсчет ссылок COM.

6 голосов
/ 20 августа 2008

Я нашел .Net Memory Profiler очень хорошая помощь при поиске утечек памяти в .Net. Он не бесплатный, как Microsoft CLR Profiler, но, на мой взгляд, более быстрый и точный. A

1 голос
/ 27 августа 2014

Одно определение: Невозможно освободить недоступную память, которая больше не может быть выделена новому процессу во время выполнения процесса выделения. В основном это можно вылечить с помощью методов ГХ или обнаружить автоматическими инструментами.

Для получения дополнительной информации, пожалуйста, посетите http://all -about-java-and-weblogic-server.blogspot.in / 2014/01 / что такое утечка памяти в java.html .

...