Почему мои окна не собирают мусор? - PullRequest
2 голосов
/ 25 января 2011

У меня есть стандартное приложение CRUD, которое работает с довольно большим объемом данных. Различные окна обращаются к разным таблицам с помощью Linq-To-SQL, и каждое окно по существу имеет сетку с ячейками, привязанными к отображаемым объектам.

Вот довольно стандартный вариант использования происходящего:

  1. Открытое окно A
  2. Закрыть окно A - Окно A теперь находится в памяти, но больше не видно.
  3. Открытое окно B
  4. Закрыть окно B - Windows A и B теперь оба в памяти и ни одна не видна.
  5. Открытое окно C
  6. Когда данные извлекаются для окна C, ресурсы для окна A освобождаются.

Так что в любой момент времени у меня в памяти хранится 2-3 окна, когда все, что мне действительно нужно, это одно. Я даже добавил код удаления в событие закрытия для этих окон, в котором все ссылки, о которых я могу думать, равны нулю.

Я попытался использовать профилировщик памяти ANTS, и я заметил, что каждое окно установлено как корень GC. Есть ли способ отключить это поведение или заставить GC собирать данные из этих окон?

Спасибо!

PS: я проверил эту ссылку , и она не решила проблему.

РЕДАКТИРОВАТЬ: Проблема в том, что пользователи получают System.OutOfMemoryExceptions.

Ответы [ 2 ]

2 голосов
/ 26 января 2011

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

Вторым обновлением, которое я сделал, было назначение владельца каждого дочернего окна в качестве основного окна приложения. После этого и профилирования я обнаружил, что дочерние окна больше не устанавливаются как корни GC.

Теперь мои дочерние окна автоматически собирают мусор после закрытия, как только запрашивается новая память для другого окна.

2 голосов
/ 25 января 2011

Как правило, у GC есть собственная жизнь. Выпуская ресурсы, вы просто уведомляете его, что ресурсы больше не нужны. Из-за ограничений производительности и реализаций, специфичных для платформы, сборка мусора занимает некоторое время.

Что облегчает жизнь разработчиков - иногда снижает производительность. Вот почему в C / C ++ вы можете владеть памятью и обновлять / удалять по своему желанию. И даже там есть пулы и другие приемы, потому что новый / удалить не дешево.

Наконец, вам необходимо определить проблему в вашей архитектуре. Почему это проблема для вас? Выход из памяти? Перестановка? Локально или на сервере? И т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...