Утечка памяти WPF WriteableBitmap?

Мне нравится использовать pQuery для вещей как это...

use pQuery;

pQuery( 'http://www.perlbuzz.com' )->find( 'a' )->each(
    sub {
        say $_->innerHTML . q{, } . $_->getAttribute( 'href' );
    }
);

Также контроль эта предыдущая Эмуляция вопроса о stackoverflow.com закона как функциональность в Perl или Python для подобных ответов.

6
задан Kent Boogaart 26 August 2009 в 13:19
поделиться

3 ответа

В общем, память в конечном итоге должна освобождаться автоматически по мере необходимости.

Однако для этого необходимо убедиться, что объект действительно не используется: никакие ссылки на объект не могут существуют где угодно, включая ссылки, которые «больше не используются». Так, в частности, если вы поместите свой WriteableBitmap и исходный BitmapSource в переменные долгоживущего класса, они не будут выпущены, пока контейнер не будет.

Кроме того, WPF использует сохраненную модель GFX: при визуализации вы на самом деле просто сохраняем инструкции по , как рендерить. «Инструкции» о том, как визуализировать растровое изображение, включают ссылку на растровое изображение - поэтому, если вы когда-либо визуализируете большое растровое изображение, то на некоторое время (по крайней мере, пока оно отображается на экране - даже если версия на экране крошечная) изображения будут сохранены.

На практике; хранить ссылки на эти растровые изображения только там, где они необходимы, и если контекст, в котором они живут, является долгоживущим (длинный вызов метода или вызов метода, генерирующий замыкание со ссылкой на растровые изображения, или член длинного live class), а затем установите для них значение NULL, если они больше не нужны.

Нет необходимости вручную освобождать память; GC.Collect () должен быть лишним. Как правило, используйте GC.Collect во время тестирования производительности, только чтобы получить представление о потреблении памяти и / или начать с чистого листа. Общая производительность обычно снижается из-за вызовов функции GC.Collect ().

или член класса-долгожителя), а затем установите для них значение NULL, если они больше не нужны.

Нет необходимости вручную освобождать память; GC.Collect () должен быть лишним. Как правило, используйте GC.Collect во время тестирования производительности, только чтобы получить представление о потреблении памяти и / или начать с чистого листа. Общая производительность обычно снижается из-за вызовов функции GC.Collect ().

или член класса-долгожителя), а затем установите для них значение NULL, если они больше не нужны.

Нет необходимости вручную освобождать память; GC.Collect () должен быть лишним. Как правило, используйте GC.Collect во время тестирования производительности, только чтобы получить представление о потреблении памяти и / или начать с чистого листа. Общая производительность обычно снижается из-за вызовов функции GC.Collect ().

1
ответ дан 17 December 2019 в 07:07
поделиться

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

Если вы не установите для них null и не принудительно не собираете мусор затем они будут собраны после того, как метод существует и произойдет сборка мусора. Выше рекомендуется принудительно собирать коллекцию самостоятельно, потому что вы, скорее всего, снижаете производительность, а не помогаете ей.

0
ответ дан 17 December 2019 в 07:07
поделиться

Запускаете ли вы свой тест в Windows XP, используя .Net 3.5 SP1? Если да, то это известная проблема, которая будет исправлена ​​в версии 4.0.

См. http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/5d88cdf1-e992-4ad4-8f56-b5dbf92dcf1c

3
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: