| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Заставить убрать обьекты с памяти. |
| Автор: Bladerender 24.5.2010, 11:28 | ||||||||
Исходные данные.
Коллекция занимает в памяти ~500 мегабайт.
Я так чувствую, что не хватает мне теоретических знаний. Хотя о GC я много читал и был уверен что потеря ссылки nullом приведет к освобождению памяти. Натолкните на правильную мысль. К чему собственно эти все разбирательства. Меня интересует именно последний блок кода, т.к. после обработки елемента колекции, мне он уже не нужен, и я хочу, что бы он сразу убирался из памяти. |
| Автор: Ram1reS 24.5.2010, 14:44 |
| Каким образом Вы определяете что память не освобождена? GC какбэ недерминировано мусор собирает по необходимости и подгонять его GC.Collect'ами - в большинстве случаев незачем. ЗЫ. Объекты таких размеров, насколько я понимаю, уходят в LOH, который при сборке не дефрагментируется, так что можете напороться на OOM. |
| Автор: Rohoss 24.5.2010, 19:19 |
можно определить по использованной в системе памяти |
| Автор: Pilger 24.5.2010, 20:33 |
| А если так. http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx |
| Автор: Bladerender 25.5.2010, 00:13 |
| Каким образом Вы определяете что память не освобождена? Смотрю по ТаскМенеджеру. В первом случае освобождалось. Во всех остальных - нет. Pilger Ну я типа почти так и сделал... Написал свой метод класса MyObj, который делает освобождение полям обьекта (колекции чистит, стринги нулит и т.д.). И потом в цыкле, после отработки елемента, вызывал ему свой Dispose(). Получилось. Объекты таких размеров, насколько я понимаю, уходят в LOH, который при сборке не дефрагментируется, так что можете напороться на OOM. Я так понимаю, что если объект целиком диспосить, то он тогда туда уходит (что-то типа как я нулил всю колекцию). Вообще этот LOH очень интерестная тема. Давайте создадим отдельную тему и там обсосем это... Очень уж эта память в .Net постоянно куда-то девается... |
| Автор: jonie 25.5.2010, 12:25 |
| в системном мониторе есть счетчики производительности .NET - по ним надо судить, а не по таск менеджеру... |
| Автор: Bladerender 25.5.2010, 23:37 |
| Т.е. ты ухудшаешь ситуацию в долгосрочной перспективе На пальцах механизм я понимаю и потому и ждал, что оно все соберется и без моего вмешательства. А на практике получилось, что без моего Dispose этот массив болтался в памяти и в итоге через 3 часа работы программы получал outOfMemory. |
| Автор: PashaPash 26.5.2010, 00:07 |
| Bladerender, out of memory ты получил из-за фрагментации LOH. Т.е. болтались не сами объекты - они скорее всего были собраны. В LOH выделяется только сам массив ссылок. Т.е. если даже все элементы задиспоужены - LOH уже фрагментирован. Вообще стоит взять профайлер памяти и посмотреть на приложение. Может там действительно где-то ссылка на массив из статической переменной |
| Автор: uranpro 28.5.2010, 13:37 |
| ну и от event`ов не забудь отписаться) |