#silverlight #windows-phone-7 #garbage-collection #observablecollection
#silverlight #windows-phone-7 #сбор мусора #observablecollection
Вопрос:
У меня есть ObservableCollection, который привязывается к списку в сводке, когда я использовал метод Clear() . Похоже, GC не перерабатывался. Поэтому, когда я продолжаю очищать ObservableCollection , память продолжает увеличиваться. Кто-нибудь знает, почему это произошло?
Комментарии:
1. Я немного не знаю о Silverlight, но в целом: вызов метода like
Clear
не приведет к запуску GC, он просто удалит несколько ссылок. Отсутствие этих ссылок может позволить GC собирать больше объектов при запуске, но когда (и, строго говоря, даже если он вообще запускается ), он запускается, не находится под вашим контролем (игнорированиеSystem.GC()
или как бы оно ни называлось, что в любом случае почти всегда является плохой идеей), и это не должно быть вашимпроблема. Какой период времени и какое потребление памяти мы берем?2. Кроме того, очистка ссылок из списка не приведет к их уничтожению, если вы не абсолютно уверены, что на них нет ссылок в каком-либо другом месте. Кроме того, есть более важные вещи, о которых нужно беспокоиться, когда речь идет о производительности, чем простой список.
3. Я понимаю, о чем вы говорите о GC. Но у меня все еще есть проблема. Сейчас я пишу приложение WP7. И на главной странице есть Pivot, в котором есть семь PivotItem. У каждого PivotItem есть listbox, который привязан к ObservableCollection . Когда я перехожу с главной страницы, я очищаю ObservableCollection. Но когда я возвращаюсь с другой страницы на главную страницу, объем памяти немного уменьшается. Если я много раз перехожу с главной страницы, объем памяти превысит лимит памяти приложения WP7. Как можно справиться с проблемой?
4. @Joel — у вас все еще есть проблемы с этим? Если да, могу ли я предложить вам отправить новый вопрос, который проясняет реальную проблему? По сути, вас не волнует (и не должно волновать), когда выполняется сборка мусора, вам важно, что у вас заканчивается память. У меня это правильно? Заголовок вопроса, который у вас есть, не даст вам нужного ответа. Просто мысль. Тем временем я подумаю о вашей проблеме. Приветствия!
Ответ №1:
Сборка мусора на WP7 отличается от других .Чистые сборщики мусора. Он запрограммирован только для запуска, когда использование памяти превышает определенный уровень.
Кроме того, имейте в виду, что сборщик мусора изменился в Mango: в оригинальном WP7 сборщик мусора не был поколенческим, в Mango он теперь поколенческий.
Если вы отчаянно хотите очистить память, тогда GC.Collect() (Windows Phone 7) или GC.Сбор (3) (только для Windows Phone 7 Mango)
будет то, что вам нужно. Выполнение этого приведет к приостановке приложения, поэтому имеет смысл сделать это там, где пользователь примет паузу — вероятно, сразу после того, как вы измените экраны или сохраните данные, это подходящее время для этого.