Как освободить оперативную память системы при создании и использовании пользовательских элементов управления - PullRequest
3 голосов
/ 18 сентября 2009

У меня есть приложение c #, которое состоит из различных экранов, каждый из которых является соответствующим пользовательским элементом управления. Приложение требует большого переключения между различными экранами, а также интенсивно использует графику. Каждый элемент управления удаляется после вызова следующего элемента управления и вызова сборщика мусора для освобождения системных ресурсов. Дело в том, что по какой-то причине системная память никогда не освобождается, и в какой-то момент после нескольких изменений экрана она неизбежно падает. Любые идеи очень приветствуются.

Ответы [ 3 ]

2 голосов
/ 18 сентября 2009

Если бы мне пришлось угадывать, вы регистрируете много событий с помощью этих элементов управления, но не отменяете регистрацию до того, как они «утилизируются», поэтому они не собираются GC.

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

0 голосов
/ 24 сентября 2009

Попробуйте использовать профилировщик памяти , (например, ants ), он скажет вам, что поддерживает объект в живых. Пытаться угадать этот тип проблемы очень сложно.

Red-gate дает 14 дней, что должно быть более чем достаточно времени, чтобы решить эту проблему и решить, предоставляет ли профилировщик памяти долгосрочное значение.

На рынке есть лотов других профилировщиков памяти (например, .NET Memory Profiler ), большинство из них имеют свободные хвосты, однако я обнаружил, что Red- Инструменты Gate просты в использовании, поэтому постарайтесь их сначала попробовать.

0 голосов
/ 18 сентября 2009

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

Более вероятная причина - круговая ссылка, где два элемента управления используют друг друга, таким образом, поддерживая другой. Может существовать целый круг элементов управления, которые поддерживают друг друга активными, и если они начнут связывать себя с большим количеством элементов управления, система рано или поздно поглотит все ресурсы.

...