Мне нравится использовать pQuery для вещей как это...
use pQuery;
pQuery( 'http://www.perlbuzz.com' )->find( 'a' )->each(
sub {
say $_->innerHTML . q{, } . $_->getAttribute( 'href' );
}
);
Также контроль эта предыдущая Эмуляция вопроса о stackoverflow.com закона как функциональность в Perl или Python для подобных ответов.
В общем, память в конечном итоге должна освобождаться автоматически по мере необходимости.
Однако для этого необходимо убедиться, что объект действительно не используется: никакие ссылки на объект не могут существуют где угодно, включая ссылки, которые «больше не используются». Так, в частности, если вы поместите свой 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 ().
Принудительный сборщик мусора без установки изображения
и растрового изображения
на null
не очистит их, потому что на них по-прежнему ссылаются локально и поэтому считаются корневыми ссылками. Это не имеет ничего общего с WriteableBitmap
и другими, вопрос о том, как работает сборщик мусора.
Если вы не установите для них null
и не принудительно не собираете мусор затем они будут собраны после того, как метод существует и произойдет сборка мусора. Выше рекомендуется принудительно собирать коллекцию самостоятельно, потому что вы, скорее всего, снижаете производительность, а не помогаете ей.
Запускаете ли вы свой тест в Windows XP, используя .Net 3.5 SP1? Если да, то это известная проблема, которая будет исправлена в версии 4.0.
См. http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/5d88cdf1-e992-4ad4-8f56-b5dbf92dcf1c