这是在 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()在 GC 之外工作,它应该释放像素数据。此外,这个例子理论上应该分配 451*451*4*1000 字节。但是这个测试应用程序在System.privateMemory中分配了 25% 以上的字节,而这 25% 永远不会被 GC 和dispose()释放。
更新 2:如果我创建 13 个图像 4059x4059 像素而不是 100 个图像 451x451 像素,那么内存分配完全等于理论大小,并且内存在调用 GC 后正确释放!我不知道为什么会这样。
UPDATE3:这是我的区间测试结果,由 Daniel MesSer 在他的回答中创建: