Как высвободить память занимаемую функцией new при захвате > 85000 байт?
GC.Commit() не помогает....
Например: Мы открывает окно с контролами (мапять выделяется), закрываем его (только часть памяти освобождается)
открываем еще раз — еще кусок памяти система забирает. и так далее.
В конце рабочего дня прграмма занимает около 250Mb!!! При этом страшно тормазит!
Что делать???
13.01.05 12:17: Перенесено из 'Вопросы разработчикам Microsoft [GDN]'
Память в .NET
От:
Аноним
Дата:
12.01.05 12:29
Оценка:
Так все-таки закрываем или уничтожаем? При уничножении убиваются все экземпляры всех классов, что дает системе сбора мусора почистить неиспользуемые (несвязанные ни с чем) куски памяти... В противном случае экземпляров будет все больше и больше... при каждом создании объекта.
Раньше все необъяснимое сваливали на потусторонние силы, а теперь на Photoshop =)
Здравствуйте, Аноним, Вы писали:
А>Так все-таки закрываем или уничтожаем? При уничножении убиваются все экземпляры всех классов, что дает системе сбора мусора почистить неиспользуемые (несвязанные ни с чем) куски памяти... В противном случае экземпляров будет все больше и больше... при каждом создании объекта.
Закрываю окно.
При создании нового ссылка ДОЛЖНА удалятся вень указатель на экземпляр объекта теряется...
Разве нет???
а
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect() again
вообще должна все очистить! но этого не происходит!
Re: Память в .NET
От:
Аноним
Дата:
12.01.05 14:39
Оценка:
Система сбора мусора работает как хочет и когда захочет, отловить момент очистки того или иного блока памяти практичеси невозможно... поэтому реально память может высвободиться к примеру через час работы с программой. =) В любом случае лучше всего емкие по объему занимаемой памяти окна уничтожать вручную... если это не поможет все-равно — имеет смысл задуматься о корректности работы самого Framework'а...
Раньше все необъяснимое сваливали на потусторонние силы, а теперь на Photoshop =)
Здравствуйте, master1, Вы писали:
M>GC.Commit() не помогает....
Надо вызывать GC.Collect()
А если серьезней, то у тебя н лицо memory leak. M>Что делать???
Бери в руки MemoryProfiler и в бой.
... << RSDN@Home 1.1.4 @@subversion >>
Память в .NET
От:
Аноним
Дата:
12.01.05 14:58
Оценка:
Господа, данный форум немного специфичен...
Вопросы в нем задаются людям непосредственно работающим в Microsoft.
Просьба не задавать тут таких простых вопросов, и тем более не ОТВЕЧАТЬ!
Все должно быть просто, очень просто, настолько просто — насколько это возможно.
Здравствуйте, Аноним, Вы писали:
А>Господа, данный форум немного специфичен... А>Вопросы в нем задаются людям непосредственно работающим в Microsoft. А>Просьба не задавать тут таких простых вопросов, и тем более не ОТВЕЧАТЬ!
Здравствуйте, Serega2k, Вы писали:
S>Система сбора мусора работает как хочет и когда захочет, отловить момент очистки того или иного блока памяти практичеси невозможно...
Вызывается при нехватке памяти...
S>поэтому реально память может высвободиться к примеру через час работы с программой. =) В любом случае лучше всего емкие по объему занимаемой памяти окна уничтожать вручную... если это не поможет все-равно — имеет смысл задуматься о корректности работы самого Framework'а...
Димпозить лучше явно, полностью согласен.
WBR, Alexander Markhonko
Re: Память в .NET
От:
Аноним
Дата:
13.01.05 08:45
Оценка:
>GC.Collect() >GC.WaitForPendingFinalizers() >GC.Collect() again >вообще должна все очистить! но этого не происходит!
Если ссылки на выделенную память используются, то можно хоть 100 раз вызывать GC.Collect() — ЭТА ПАМЯТЬ НЕ ОСВОБОДИТЬСЯ
Более частый, чем это необходимо, вызов метода GC.Collect может отрицательно сказаться на производительности. Следует также избегать разрешать вызовы метода GC.Collect в точках кода программы, в которых пользователи смогут вызывать его слишком часто. Это может нарушить работу ядра оптимизации сборщика мусора, которое определяет наилучшее время выполнения сборки мусора.