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

Причины, почему селекторы на основе id не работают

  1. Элемент / DOM с указанным идентификатором еще не существует.
  2. Элемент существует, но он не является зарегистрированный в DOM [в случае, если HTML-узлы динамически добавляются из ответов Ajax].
  3. Присутствует более одного элемента с тем же идентификатором, который вызывает конфликт.

Решения

  1. Попробуйте получить доступ к элементу после его объявления или, альтернативно, использовать такие вещи, как $(document).ready();
  2. . Для элементов, исходящих из ответов Ajax, используйте метод .bind() для jQuery. В старых версиях jQuery для этого было .live().
  3. Используйте инструменты [например, плагин webdeveloper для браузеров], чтобы найти дубликаты идентификаторов и удалить их.
170
задан Zoe 8 June 2018 в 15:37
поделиться

14 ответов

Лучшее объяснение, которое я видел, находится в Главе 7 свободного Основы Программирования электронной книги .

В основном, в .NET утечка памяти происходит, когда ссылочные объекты базированы и таким образом не могут быть собраны "мусор". Это происходит случайно, когда Вы держитесь за ссылки вне намеченного объема.

Вы будете знать, что у Вас есть утечки, когда Вы начинаете получать OutOfMemoryExceptions, или Ваше использование памяти повышается вне того, что Вы ожидали бы (, PerfMon имеет хорошие счетчики памяти).

Понимание .NET модель памяти является Вашим лучшим способом избежать его. А именно, понимая, как сборщик "мусора" работает и как ссылки работают — снова, я отсылаю Вас к главе 7 электронной книги. Кроме того, помнить распространенные ошибки, вероятно, быть наиболее распространенным являющийся событиями. Если объект А будет зарегистрирован к событию на объекте B, то возразите , то А будет слоняться поблизости до объекта исчезает B, потому что B содержит ссылку на [1 117] А . Решение состоит в том, чтобы не зарегистрировать Ваши события, когда Вы сделаны.

, Конечно, хороший профиль памяти позволит Вам видеть свои графы объектов и исследовать вложение/ссылку Ваших объектов видеть, куда ссылки прибывают из и какой корневой объект ответственен ( профиль муравьев красного логического элемента , JetBrains dotMemory, , memprofiler является действительно хорошим выбором, или можно использовать только для текста WinDbg и SOS, но я настоятельно рекомендовал бы коммерческий/визуальный продукт, если Вы не настоящий гуру).

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

110
ответ дан q-l-p 23 November 2019 в 20:47
поделиться

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

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

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

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

7
ответ дан Brian Mains 23 November 2019 в 20:47
поделиться

Я нашел .Net Профилировщик Памяти очень хорошая справка при нахождении утечек памяти в.Net. Это не является свободным как Microsoft CLR Profiler, но является быстрее и главным, по-моему.

6
ответ дан Lars Truijens 23 November 2019 в 20:47
поделиться

Я соглашусь с Bernard относительно в .net, какова утечка мадам была бы.

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

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

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

8
ответ дан Siyual 23 November 2019 в 20:47
поделиться

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

Утечка достаточно памяти и Операционная система могут решить разрешить проблему от Вашего имени.

9
ответ дан Josh 23 November 2019 в 20:47
поделиться

Почему люди думают, что утечка памяти в.NET не является тем же как никакой другой утечкой?

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

Относительно.NET и других инструментов программирования, были идеи о сборке "мусора" и другие способы минимизировать ситуации, которые подадут Вашу заявку просочиться. Но лучший метод предотвращения утечек памяти - то, что необходимо понять базовую модель памяти, и как вещи работают на платформе, которую Вы используете.

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

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

В.NET, с другой стороны, много людей думает, что GC очистит все. Ну, это делает некоторых для Вас, но необходимо удостовериться, что это так..NET действительно обертывает много вещей, таким образом, Вы не всегда знаете, имеете ли Вы дело с управляемым или неуправляемым ресурсом, и необходимо удостовериться что, с чем Вы имеете дело. Обрабатывая шрифты, ресурсы GDI, активный каталог, базы данных и т.д. обычно являются вещами, которые необходимо высматривать.

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

я вижу, что у большого количества людей есть это, хотя, и я действительно надеюсь, что это закончится. Вы не можете попросить, чтобы пользователь завершил Ваше приложение для чистки путаницы! Смотрите на браузер, который может быть IE, FF и т.д., затем открыть, скажем, Google Reader, позволить ему оставаться в течение нескольких дней и смотреть на то, что происходит.

, Если Вы тогда открываете другую вкладку в браузере, перемещении на некоторый сайт, затем закрывают вкладку, которая разместила другую страницу, которая заставила браузер протечь, Вы думаете, что браузер освободит память? Не так с IE. На моем компьютере IE легко съест 1 гибибайт памяти в короткий срок (приблизительно 3-4 дня), если я буду использовать Google Reader. Некоторые newspages еще хуже.

11
ответ дан Nathan Tuggy 23 November 2019 в 20:47
поделиться

я предполагаю в управляемой среде, утечка была бы Вами сохраняющий ненужную ссылку на большой блок памяти вокруг.

Абсолютно. Кроме того, не используя.Dispose () метод на доступных объектах в надлежащих случаях может вызвать утечки мадам. Самый легкий способ сделать это с блоком использования, потому что это автоматически выполняет.Dispose () в конце:

StreamReader sr;
using(sr = new StreamReader("somefile.txt"))
{
    //do some stuff
}

И если Вы создаете класс, который использует неуправляемые объекты, если Вы не реализуете IDisposable правильно, Вы могли бы вызывать утечки памяти для пользователей своего класса.

10
ответ дан Seibar 23 November 2019 в 20:47
поделиться

Лучшее объяснение того, как сборщик "мусора" работает, находится в Jeff Richters CLR с помощью книги C#, (Ch. 20). Чтение этого дает большое основание для понимания, как объекты сохраняются.

Одна из наиболее распространенных причин базирующихся объектов случайно событиями присоединения вне класса. Если Вы поднимаете трубку, внешнее событие

например,

SomeExternalClass.Changed += new EventHandler(HandleIt);

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

, Как упомянуто выше, профилировщик памяти SciTech превосходен при показе Вам корни объектов, которые Вы подозреваете, протекают.

, Но существует также очень быстрый способ проверить, что конкретный тип является просто использованием WnDBG (можно даже использовать это в VS.NET непосредственное окно, в то время как присоединено):

.loadby sos mscorwks
!dumpheap -stat -type <TypeName>

Теперь делают что-то, что Вы думаете, расположит объекты того типа (например, закроет окно). Удобно здесь иметь кнопку отладки где-нибудь, которая будет работать System.GC.Collect() пару раз.

Тогда работает !dumpheap -stat -type <TypeName> снова. Если число не понижалось или не понижалось так, как Вы ожидаете, то у Вас есть основание для дальнейшего расследования. (Я получил эту подсказку от семинара, данного Трамбовка Ingo ).

15
ответ дан vard 23 November 2019 в 20:47
поделиться

Используя Профилировщика CLR от Microsoft http://www.microsoft.com/downloads/details.aspx?familyid=86ce6052-d7f4-4aeb-9b7a-94635beebdda&displaylang=en отличный способ определить, какие объекты содержат память, что поток выполнения приводит к созданию этих объектов и также контролю, который возражает живой где на "куче" (фрагментация, LOH, и т.д.).

16
ответ дан Nick 23 November 2019 в 20:47
поделиться

Если необходимо диагностировать утечку памяти в.NET, проверьте эти ссылки:

http://msdn.microsoft.com/en-us/magazine/cc163833.aspx

http://msdn.microsoft.com/en-us/magazine/cc164138.aspx

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

Microsoft также имеет более новый инструмент, чтобы помочь с генерацией дампов катастрофического отказа, заменить ADPlus, названный DebugDiag.

http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en

19
ответ дан vard 23 November 2019 в 20:47
поделиться

Я определил бы утечки памяти как объект, не освобождающий всю память, выделенную после того, как она завершилась. Я нашел, что это может произойти в Вашем приложении при использовании Windows API и COM (т.е. неуправляемый код, который имеет ошибку в нем или не управляется правильно), в платформе и в сторонних компонентах. Я также нашел, что не плыть по течению после использования определенных объектов как перья может вызвать проблему.

я лично пострадал Из Исключений Памяти, которые могут быть вызваны, но не эксклюзивны к утечкам памяти в точечных сетевых приложениях. (OOM может также прибыть из прикрепления, см. Прикреплять Artical). Если Вы не получаете ошибки OOM или должны подтвердить - ли это утечка памяти, вызывающая его тогда, единственный путь состоит в том, чтобы представить Ваше приложение.

я также попытался бы гарантировать следующее:

a) Все, что реализует Idisposable, расположено или использование наконец блок или оператор использования, они включают кисти, перья и т.д. (некоторые люди требуют ни на что устанавливать все, кроме того)

b), Что-либо, что имеет близкий метод, закрывается снова с помощью наконец или оператор использования (хотя я нашел, что использование не всегда закрывается зависящий, если Вы объявили объект вне оператора использования)

c) при использовании неуправляемого API кода/окон, что с ними имеют дело правильно после. (некоторые имеют, очищают методы для высвобождения средств)

Hope, которой это помогает.

19
ответ дан John 23 November 2019 в 20:47
поделиться

Я думаю, "что является утечкой памяти" и, "что является эффектами" вопросы хорошо уже, были отвечены, но я хотел добавить еще несколько вещей по другим вопросам...

, Как понять, просачивается ли Ваше приложение

, Один интересный путь состоит в том, чтобы открыться perfmon и добавить трассировки для # байты во всей "куче" и # Генерал 2 набора в каждом случае, смотрящем просто на Ваш процесс. Если осуществление конкретной функции заставляет общие байты увеличиваться, и та память остается выделенной после набора следующего поколения 2, Вы могли бы сказать, что функция пропускает память.

, Как предотвратить

, Другие хорошие мнения были даны. Я просто добавил бы, что, возможно, обычно пропустил , причина утечек памяти.NET состоит в том, чтобы добавить обработчики событий к объектам, не удаляя их. Обработчик событий, присоединенный к объекту, является формой ссылки на тот объект, так предотвратит набор даже после того, как все другие ссылки пошли. Всегда не забывайте отсоединять обработчики событий (использующий -= синтаксис в C#).

утечка уходит, когда процесс выходит, и что относительно взаимодействующего с COM?

, Когда Ваш процесс выходит, все с отображенной памятью в его адресное пространство исправлены ОС, включая любые COM-объекты, подаваемые от DLLs. Сравнительно редко COM-объекты могут быть поданы от отдельных процессов. В этом случае, когда Ваш процесс выходит, можно все еще быть ответственны за память, выделенную в любых серверных процессах COM, которые Вы использовали.

32
ответ дан Brian Mains 23 November 2019 в 20:47
поделиться

Я предполагаю в управляемой среде, утечка была бы Вами сохраняющий ненужную ссылку на большой блок памяти вокруг.

14
ответ дан Bernard 23 November 2019 в 20:47
поделиться

Строго говоря утечка памяти использует память, которая "больше не используется" программой.

"Больше не используемый" имеет больше чем одно значение, это могло значить "нет более ссылочный для него", то есть, полностью неисправимый, или это могло означать, ссылаемый, восстанавливаемый, неиспользованный, но программа сохраняет ссылки так или иначе. Только позже относится к.Net за совершенно управляемые объекты . Однако не все классы прекрасны, и в какой-то момент базовая неуправляемая реализация могла пропустить ресурсы постоянно для того процесса.

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

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

Для большинства утечек, ресурсы восстанавливаются, когда процесс завершается, однако некоторые ресурсы не всегда восстанавливаются в некоторых точных случаях, дескрипторы курсора GDI известны за это. Конечно, если бы у Вас есть механизм межпроцессорного взаимодействия, память, выделенная в другом процессе, не была бы освобождена, пока тот процесс не освобождает его или завершается.

35
ответ дан Coincoin 23 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: