Что пути состоят в том, чтобы решить Утечки памяти в C#

Нет необходимости использовать DisplayFor здесь:

<source src="@(basePath + item.url)" type="video/mp4">
10
задан Yves M. 7 December 2014 в 02:01
поделиться

10 ответов

C#, Платформа.NET использует Управляемую память, и все (но выделенные неуправляемые ресурсы) собрано "мусор".

Безопасно предположить, что управляемые типы всегда собираются "мусор". Это включает arrays, classes и structures. Не стесняйтесь делать int[] stuff = new int[32]; и забудьте об этом.

Если Вы открываете файл, соединение с базой данных, или какой-либо другой неуправляемый ресурс в классе, реализуете интерфейс IDisposable, и в Вашем Располагать метод освобождают неуправляемый ресурс.

Любой класс, который реализует IDisposable, должен явно закрываться или использоваться в (я думаю спокойный) Используя блок как;

using (StreamReader reader = new StreamReader("myfile.txt"))
{
   ... your code here
}

Здесь.NET расположит читателя, когда из {} определят объем.

18
ответ дан 3 December 2019 в 14:00
поделиться

Первая вещь с GC состоит в том, что это недетерминировано; если Вы хотите ресурс, очищенный быстро, реализация IDisposable и используйте using; это не собирает управляемую память, но может помочь много с неуправляемыми ресурсами и прогрессивными цепочками.

В частности, вещи не упустить:

  • большое прикрепление (устанавливает много ограничений на то, что GC может сделать),
  • много финализаторов (Вам обычно не нужны они; замедляет GC),
  • статические события - простой способ поддержать много графиков большого объекта;-p
  • события на недорогом длительном объекте, который видит дорогой объект, который должен был быть очищен
  • "полученные переменные" случайно поддержание графиков

Для исследования утечек памяти... "SOS" является одним из самых легких маршрутов; можно использовать SOS для нахождения всех экземпляров типа, и что видит его и т.д.

11
ответ дан 3 December 2019 в 14:00
поделиться

Основные источники утечек памяти, о которых я могу думать:

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

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

  • Взаимодействие с собственным кодом и отказ освободить его. Даже при использовании управляемых оболочек, которые реализуют финализаторы, часто CLR не чистит их достаточно быстро, потому что он не понимает объема потребляемой памяти. Необходимо использовать использование (IDisposable) {} шаблон
3
ответ дан 3 December 2019 в 14:00
поделиться

В целом, меньше Вы волнуетесь о выделении памяти в C#, более обеспеченное, которое Вы. Я предоставил бы профилировщику право говорить мне, когда у меня есть проблемы с набором.

Вы не можете создать утечки памяти в C# таким же образом, как Вы делаете в C++. Сборщик "мусора" будет всегда "иметь Вашу спину". То, что можно сделать, создают объекты и содержат ссылки на них даже при том, что Вы никогда не используете их. Это - запах кода для внимательности.

Кроме этого:

  • Имейте некоторое понятие того, как часто набор будет происходить (по причинам производительности)
  • Не держите ссылки на объекты дольше, чем Вам нужно
  • Избавьтесь от объектов, которые реализуют IDisposable, как только Вы сделаны с ними (используйте using синтаксис)
  • Правильно реализуйте интерфейс IDisposable
3
ответ дан 3 December 2019 в 14:00
поделиться

Еще одна вещь рассмотреть для управления памятью состоит в том, если Вы реализуете какие-либо Шаблоны "наблюдатель" и не избавляетесь от ссылок правильно.

Например: Возразите, что Объект часов B Объект B расположен, если ссылка от до B не будет расположена свойства, то GC не будет properyly избавляться от объекта. Becuase, который обработчику событий все еще присваивают GC, не рассматривает его как не используемый ресурс.

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

Существуют некоторые приложения управления отличной памятью для контроля то, что продолжает "кучу" приложения. Я нашел большое преимущество от использования.Net Memory Profiler.

HTH

1
ответ дан 3 December 2019 в 14:00
поделиться

Я рекомендую использовать Профилировщика Памяти.NET

Профилировщик Памяти.NET является мощным инструментом для нахождения утечек памяти и оптимизации использования памяти в программах, записанных в C#, VB.NET или любом другом Языке.NET.

Профилировщик Памяти.NET поможет Вам к:

  • Просмотрите память в реальном времени и информацию о ресурсе
  • Легко определите утечки памяти путем сбора и сравнения снимков памяти.NET
  • Найдите экземпляры, которые правильно не расположены
  • Получите подробную информацию об использовании неуправляемого ресурса
  • Оптимизируйте использование памяти
  • Исследуйте проблемы памяти в производственном коде
  • Выполните автоматизированное тестирование памяти
  • Получите информацию о собственной памяти

Смотрите на их видео учебные руководства:

http://memprofiler.com/tutorials/

1
ответ дан 3 December 2019 в 14:00
поделиться

Можно использовать инструменты как профилировщик CLR, которого это занимает время, чтобы изучить, как использовать его правильно, но в конце концов это свободно. (Это помогало мне несколько раз найти свою утечку памяти),

0
ответ дан 3 December 2019 в 14:00
поделиться

Лучший способ гарантировать, что объекты удалены, или в малопонятном жаргоне.NET, собрал "мусор", должен гарантировать, что все корневые ссылки (ссылки, которые могут быть прослежены через методы и объекты к первому методу на стеке вызовов потока) к объекту устанавливаются в NULL.

GC не может, и не быть, собирать объект, если существуют какие-либо внедренные ссылки на него, неважно, реализует ли он IDisposable или нет.

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

0
ответ дан 3 December 2019 в 14:00
поделиться

Что лучшие пути состояли в том, чтобы удалить вещи?

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

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

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

0
ответ дан 3 December 2019 в 14:00
поделиться

Другие уже упомянули важность IDisposable, и некоторые вещи не упустить в Вашем коде.

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

CLR через C# Jeffrey Richter является превосходной книгой. Стоящий покупной цены только за главу по GC и памяти.

Этот блог (Microsoft "Инженер технической поддержки ASP.NET") часто является моим дежурным источником для подсказок и приемами для использования WinDbg, SOS, и для определения определенных типов утечек памяти. Tess даже разработала демонстрации/лаборатории отладки.NET, которые будут идти, Вы через общую память выходите и как распознать и решить их.

Средства отладки для Windows (WinDbg, SOS, и т.д.)

1
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

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