Нет необходимости использовать DisplayFor
здесь:
<source src="@(basePath + item.url)" type="video/mp4">
C#, Платформа.NET использует Управляемую память, и все (но выделенные неуправляемые ресурсы) собрано "мусор".
Безопасно предположить, что управляемые типы всегда собираются "мусор". Это включает arrays
, classes
и structures
. Не стесняйтесь делать int[] stuff = new int[32];
и забудьте об этом.
Если Вы открываете файл, соединение с базой данных, или какой-либо другой неуправляемый ресурс в классе, реализуете интерфейс IDisposable, и в Вашем Располагать метод освобождают неуправляемый ресурс.
Любой класс, который реализует IDisposable, должен явно закрываться или использоваться в (я думаю спокойный) Используя блок как;
using (StreamReader reader = new StreamReader("myfile.txt"))
{
... your code here
}
Здесь.NET расположит читателя, когда из {} определят объем.
Первая вещь с GC состоит в том, что это недетерминировано; если Вы хотите ресурс, очищенный быстро, реализация IDisposable
и используйте using
; это не собирает управляемую память, но может помочь много с неуправляемыми ресурсами и прогрессивными цепочками.
В частности, вещи не упустить:
Для исследования утечек памяти... "SOS" является одним из самых легких маршрутов; можно использовать SOS для нахождения всех экземпляров типа, и что видит его и т.д.
Основные источники утечек памяти, о которых я могу думать:
хранение ссылается к объектам, в которых Вы больше не нуждаетесь (обычно в своего рода наборе), Таким образом, здесь необходимо помнить, что все вещи, что Вы добавляете к набору, что у Вас есть ссылка также, останутся в памяти.
Наличие циклических ссылок, например, регистрация делегатов с событием. Таким образом даже при том, что Вы явно не ссылаетесь на объект, он не может быть собран "мусор", потому что один из его методов регистрируется как делегат с событием. В этих случаях необходимо не забыть удалять делегата прежде, чем отбросить ссылку.
В целом, меньше Вы волнуетесь о выделении памяти в C#, более обеспеченное, которое Вы. Я предоставил бы профилировщику право говорить мне, когда у меня есть проблемы с набором.
Вы не можете создать утечки памяти в C# таким же образом, как Вы делаете в C++. Сборщик "мусора" будет всегда "иметь Вашу спину". То, что можно сделать, создают объекты и содержат ссылки на них даже при том, что Вы никогда не используете их. Это - запах кода для внимательности.
Кроме этого:
using
синтаксис)Еще одна вещь рассмотреть для управления памятью состоит в том, если Вы реализуете какие-либо Шаблоны "наблюдатель" и не избавляетесь от ссылок правильно.
Например: Возразите, что Объект часов B Объект B расположен, если ссылка от до B не будет расположена свойства, то GC не будет properyly избавляться от объекта. Becuase, который обработчику событий все еще присваивают GC, не рассматривает его как не используемый ресурс.
Если у Вас есть маленький набор объектов, Вы работаете с этим, может меня не важный. Однако, если Ваша работа с тысячами объектов это может вызвать постепенное увеличение памяти по сроку действия приложения.
Существуют некоторые приложения управления отличной памятью для контроля то, что продолжает "кучу" приложения. Я нашел большое преимущество от использования.Net Memory Profiler.
HTH
Я рекомендую использовать Профилировщика Памяти.NET
Профилировщик Памяти.NET является мощным инструментом для нахождения утечек памяти и оптимизации использования памяти в программах, записанных в C#, VB.NET или любом другом Языке.NET.
Профилировщик Памяти.NET поможет Вам к:
Смотрите на их видео учебные руководства:
Можно использовать инструменты как профилировщик CLR, которого это занимает время, чтобы изучить, как использовать его правильно, но в конце концов это свободно. (Это помогало мне несколько раз найти свою утечку памяти),
Лучший способ гарантировать, что объекты удалены, или в малопонятном жаргоне.NET, собрал "мусор", должен гарантировать, что все корневые ссылки (ссылки, которые могут быть прослежены через методы и объекты к первому методу на стеке вызовов потока) к объекту устанавливаются в NULL.
GC не может, и не быть, собирать объект, если существуют какие-либо внедренные ссылки на него, неважно, реализует ли он IDisposable или нет.
Циклические ссылки не налагают штрафа или возможности утечек памяти, поскольку GC отмечает, какие объекты это посетило в графе объектов. В случае делегатов или eventhandlers может быть распространено забыть удалять ссылку в событии к целевому методу, так, чтобы объект, который содержит целевой метод, не мог быть собран, если событие базировано.
Что лучшие пути состояли в том, чтобы удалить вещи?
Примечание: следующие работы только для типов, содержащих неуправляемые ресурсы. Это не помогает с чисто управляемыми типами.
Вероятно, лучший метод должен реализовать и следовать за шаблоном IDisposable; и назовите расположить метод на всех объектах, реализовав его.
Оператор 'использования' является Вашим лучшим другом. Свободно помещенный, это будет звонить, располагают для Вас на объектах, реализовывая IDisposable.
Другие уже упомянули важность IDisposable, и некоторые вещи не упустить в Вашем коде.
Я хотел предложить некоторые дополнительные ресурсы; я нашел следующее неоценимое при изучении деталей.NET GC и как диагностировать проблемы памяти в приложениях.NET.
CLR через C# Jeffrey Richter является превосходной книгой. Стоящий покупной цены только за главу по GC и памяти.
Этот блог (Microsoft "Инженер технической поддержки ASP.NET") часто является моим дежурным источником для подсказок и приемами для использования WinDbg, SOS, и для определения определенных типов утечек памяти. Tess даже разработала демонстрации/лаборатории отладки.NET, которые будут идти, Вы через общую память выходите и как распознать и решить их.
Средства отладки для Windows (WinDbg, SOS, и т.д.)