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

Похоже, это связано с этой ошибкой . Он был исправлен в мастер-репо и должен сделать Chrome стабильным 75 (18 апреля, согласно календарю релиза Chromium ).

Между тем, можно проверить исправление в Chrome Canary .

7
задан Merus 1 March 2009 в 23:06
поделиться

12 ответов

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

11
ответ дан 6 December 2019 в 09:22
поделиться

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

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

5
ответ дан 6 December 2019 в 09:22
поделиться

Мне нравится Профилировщик CLR от Microsoft. Это обеспечивает некоторые большие инструменты для визуализации утечки разыскивания и управляемая "куча".

2
ответ дан 6 December 2019 в 09:22
поделиться

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

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

1
ответ дан 6 December 2019 в 09:22
поделиться

Получите это: http://www.red-gate.com/Products/ants_profiler/index.htm

Память и профилирование производительности являются потрясающими. Способность на самом деле счесть нужным числа вместо предположения делает оптимизацию довольно быстро. Я использовал его вполне немного на работе для сокращения объема потребляемой памяти нашего главного приложения.

1
ответ дан 6 December 2019 в 09:22
поделиться

Управляемая отладка добавляет в SoS (Сын Забастовки) очень мощно для того, чтобы разыскать управляемую память 'утечки', так как они, по определению поддающиеся обнаружению от корней gc.

Это будет работать в WinDbg или Visual Studio (хотя во многих отношениях легче использовать в WinDbg),

Нисколько не легко справиться с. Вот учебное руководство

Я был бы второй рекомендация проверить блог Tess Fernandez также.

0
ответ дан 6 December 2019 в 09:22
поделиться
  1. Добавьте код к конструктору объекта unamanaged зарегистрироваться, когда это - onstructed, и отсортируйте уникальный идентификатор. Используйте тот уникальный идентификатор, когда объект уничтожается снова, и можно, по крайней мере, сказать, которые теряются.
  2. Grep код для каждого места Вы создаете новый объект; следуйте за тем путем выполнения кода, чтобы видеть, есть ли у Вас соответствие, уничтожают.
  3. Добавьте указатели объединения в цепочку на созданные объекты, таким образом, у Вас есть ссылка на объект, созданный прежде и после текущего. Затем можно развернуться через них позже.
  4. Добавьте ссылочные счетчики.
  5. Существует ли "отладка malloc" доступна?
0
ответ дан 6 December 2019 в 09:22
поделиться

Как Вы знаете для того, что у Вас на самом деле есть утечка памяти?

Еще одна вещь: Вы пишете, что Ваши классы обработки используют события. При регистрации обработчика событий, это сохранит объект, который владеет живым событием - т.е. GC не может собрать его. Удостоверьтесь, что Вы вычеркиваете из списка все обработчики событий, если Вы хотите, чтобы Ваши объекты были собраны "мусор".

0
ответ дан 6 December 2019 в 09:22
поделиться

Будьте осторожны, как Вы определяете "утечку". "Использование, больше памяти" или даже "использует слишком много памяти", не является тем же как "утечкой памяти". Это особенно верно в собравшей "мусор" среде. Может просто случиться так, что GC не должен был собирать дополнительную память, которую Вы видите используемый. Также будьте осторожны относительно различия между использованием виртуальной памяти и использованием физической памяти.

Наконец не все "утечки памяти" вызываются видами "памяти" проблем. Мне когда-то сказали (не спрошенному) для фиксации срочной утечки памяти, которая заставляла IIS часто перезапускать. На самом деле я сделал профилирование и нашел, что использовал много строк через класс StringBuilder. Я реализовал пул объектов (из статьи MSDN) для StringBuilders, и использование памяти понизилось существенно.

IIS, все еще перезапущенный так же, как часто. Это было то, потому что не было никакой утечки памяти. Вместо этого был неуправляемый код, который утверждал, что был ориентирован на многопотоковое исполнение, но не был. Используя его в веб-сервисе (несколько потоков) заставил его писать на всем протяжении "кучи" Библиотеки времени выполнения C. Так как никто не искал неуправляемые исключения, никто не видел это, пока я, оказалось, не сделал некоторого профилирования с AQtime от Автоматизированного QA. Это, оказывается, имеет окно событий, которое, оказалось, отобразило крики боли от Библиотеки времени выполнения C.

Ушли помещенные блокировки вокруг вызовов к неуправляемому коду и "утечка памяти".

0
ответ дан 6 December 2019 в 09:22
поделиться

Если Ваш неуправляемый объект действительно является причиной утечки, можно хотеть иметь его вызов AddMemoryPressure когда это выделяет неуправляемую память и RemoveMemoryPressure в Finalize/Dispose/, где когда-либо это освобождает неуправляемую память. Это даст GC лучший дескриптор на ситуации, потому что это не может понять, что существует потребность запланировать набор иначе.

0
ответ дан 6 December 2019 в 09:22
поделиться

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

0
ответ дан 6 December 2019 в 09:22
поделиться

Лучшая память профильный инструмент для .NET является этим:

http://memprofiler.com

Кроме того, в то время как я здесь, лучший профилировщик производительности для .NET - это:

http://www.yourkit.com/dotnet/download/index.jsp

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

Я работаю над оперативным игровым механизмом с по 700k строкам кода, записанным в C#, и провел сотни часов с помощью обоих этих инструментов. Я использовал Научный Технический продукт с 2002 и YourKit! в течение прошлых трех лет. Хотя я попробовал довольно многих из других, я всегда возвращался к ним.

По моему скромному мнению, они являются оба абсолютно блестящими.

0
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

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