2010-01-04 3 views
0

Это странный вариант. Я делаю приложение, которое является своего рода игрой, и я хотел иметь эффект выстрела. Я сделал это однажды вечером, и все это сработало хорошо, пока я не заметил, что мой браузер ел более 300 мегабайт барана, едя 1 мегаграмм каждые 5 секунд, в основном, когда произошла звездообразование.Попытка отследить утечку памяти Silverlight, которая происходит только в браузерах

Вот пример раздели вниз только в звездообразования: http://www.sizzln.com/example.htm

Первая мысль, я не удаляя объекты или все еще есть ссылки где-то. Я помещаю каждую созданную звезду в холст, но я удаляю старые старты каждые 3 секунды. У меня также много DoubleAnimations, но у меня даже есть обратный вызов, чтобы установить все в null.

Вот странная часть, если я конвертирую ее в WPF, это не произойдет, если я запустил ее внутри Silverlight Spy 3, это произошло. Если я беру кучу кучи с помощью WinDbg и SOS.dll, он сообщает, что он должен использовать только от 1,8 до 3 МБ оперативной памяти.

У меня есть GC, работающий каждые 3 секунды для очистки, но это никогда не имеет никакого эффекта. Я вижу в heapdump, что многие объекты теперь удалены, и я всегда возвращаюсь к 1,8 мегабайтам или около того после GC, но память, отображаемая в диспетчере задач, просто продолжает расти.

Я не знаю, что делать, я думаю, что я тщательно удаляю объекты, если моя куча не является честной.

+0

Вот источник: http://www.sizzln.com/example.zip Это Wouldnt позвольте мне добавить его выше, к новым :( –

+0

Какой ОС вы используете Task Manager очень отличается от XP до Vista для Win 7 –

+0

Я бегу на Windows 7 64bit. –

ответ

0

Вы используете Vista или Win7? Похоже, что ОС не восстанавливает память, так как она shouldn't unless it needs to.
Возможно, также, что Silverlight GC не освобождает его буферы, исходя из предположения, что память, возможно, потребуется перераспределить в ближайшее время.

В любом случае это звучит не так, как о чем беспокоиться, пока профайлер говорит, что ваша программа использует только 1.8MB после запуска GC.

+0

Windows 7 64 бит –

0

Я просто ненадолго просмотрел ваш код. У вас много мест, где вы подключаетесь к событиям (+ =), но никогда не отцепите (- =). Это жесткие ссылки и поэтому никогда не будут собираться, если они в конечном счете связаны с корневым объектом.

+0

Не повезло, я даже полностью удалил большое поколение таймеров. Я думаю, что у него есть что-то, что может быть связано с поколением доски. –

0

OK Я собираюсь отсортировать свой собственный вопрос. У Silveright нет удобного метода «BeginAnimation», поэтому я нашел онлайн быстрый способ добавить расширение, чтобы сделать в основном то же самое, он сделал это, создав раскадровку и запустив ее.

Однако, он просто остался там, я точно не знаю, к чему он подключен. Вызов Stop() на нем после завершения исправления проблемы с памятью.

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

Смежные вопросы