Это простой тест на AS3 для выделения памяти BitmapData.
private function memoryTest(): void
{
trace("BitmapData memory test. Create bmps..."); // First breakpoint
var bmps:Array = new Array (1000);
for (var i:int=0; i<1000; i++)
{
bmps[i] = new BitmapData(451, 451, true, 0);
trace(i+". bmp created");
}
trace("All bmps created."); // Second breakpoint
for (i=0; i<1000; i++)
{
bmps[i].dispose();
bmps[i] = null;
}
bmps.splice(0, bmps.length);
bmps = null;
freeMemoryGC();
trace("All bmps deleted.");
trace("Test complete."); // Last breakpoint
}
private function freeMemoryGC(): void
{
// the GC will perform a full mark/sweep on the second call.
try
{
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
}
catch (e:*)
{
}
System.gc();
System.gc();
}
В этом тесте есть 3 точки останова, которые прокомментированы в коде. Точки останова приостанавливают выполнение программы на некоторое время. Точки останова соответствуют горизонтальным линиям на этой диаграмме состояния памяти.
У меня вопрос: почему не вся память была освобождена после вызовов dispose ()? Что не так в этом коде и как правильно очистить объекты BitmapData?
ОБНОВЛЕНИЕ 1: я не думаю, что проблема в сборщике мусора. dispose () работает вне сборщика мусора и должен освободить данные пикселей. Также в этом примере теоретически должно быть выделено 451 * 451 * 4 * 1000 байт. Но это тестовое приложение выделяет на 25% больше байтов в System.privateMemory, и эти 25% никогда не освобождаются сборщиком мусора и dispose ().
ОБНОВЛЕНИЕ 2: если я создам 13 изображений размером 4059x4059 пикселей вместо 100 изображений 451x451 пикселей, тогда объем памяти будет точно равен теоретическому размеру, а память будет освобождена правильно после вызова GC! Не знаю, почему так происходит.
ОБНОВЛЕНИЕ 3: вот мои результаты интервального теста, созданные Дэниелом Мессером в его ответе:
memoryTest()
? Есть ли что-то помимо этой функции, выделяющее память? - person NoobsArePeople2   schedule 07.08.2012