Я работаю над приложением, которое имеет проблемы с потреблением памяти. Если пользователь нажимает достаточно долго в приложении, он заканчивается исключением OutOfMemoryException.Почему NET сборщик мусора никогда не звонил?
Профилирование приложения с помощью «ANTI Memory Profiler» довольно долгое время, и, по моему мнению, нет «классической» утечки памяти (например, обработчики событий, которые препятствуют сбору мусора).
Но все объекты, которые остаются в памяти, имеют одну общую черту - они используют, прямо или косвенно, стандартный элемент управления .NET (например, TextBox, Numberbox), который реализует Finalizer. В «Графе хранения экземпляров памяти ANTS Memory» я вижу, что единственным экземпляром, который содержит ссылку на элементы управления, является .NET Finalizer Queue.
Ссылка сохранение графа (у меня не хватает репутации размещать изображения прямо :-)) ->http://i50.tinypic.com/2d6r6nn.png
Поэтому я исследовал в направлении взаимоблокировки в Finalizer тему (см http://dotnetdebug.net/2005/06/22/blocked-finalizer-thread/) но не смог найти показания для тупика. Кроме того, то, что против теории тупика, заключается в том, что после моментального снимка памяти с помощью Profiler Profiler, который запускает GC.Collect(), представления собираются с мусором, соответственно, их Finalizer выполняются, и все в порядке.
Итак, это похоже на нормальный жизненный цикл .net-объекта с Finalizer, правильно? Но в моем приложении я могу щелкнуть, пока OutOfMemoryException и сборщик мусора никогда не запустится!
Последняя попытка решить проблему состояла в использовании GC.AddMemoryPressure(), потому что в представлениях много растровых изображений, которые выделяют довольно много неуправляемого кода. Но и это не могло спровоцировать сборщика мусора для сбора свободной памяти.
Итак, я думаю, что в приложении есть что-то внутренне неправильное, что предотвращает освобождение GC от памяти, но я понятия не имею, что.
Неужели кто-то подвергся подобным переживаниям и имеет какую-либо подсказку?
С наилучшими пожеланиями
Andi
Ваша проблема, вероятно, связана с тем, что растровые изображения не собираются, потому что они имеют длинные ссылки на живые существа. Не могли бы вы показать нам код растрового материала. – user7116