这是对AS3进行BitmapData内存分配的简单测试。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: 这里是我的间隔测试,由丹尼尔·梅塞尔在他创造的结果回答:
运行这个测试100个倍和检查。我建议你制作间隔并在每一帧上运行。调用GC并不意味着内存将回到相同的状态。 – turbosqel 2012-08-06 17:48:04
关于100倍时间和间隔的有趣想法。 – Eugene 2012-08-06 22:49:50
你是怎么调用'memoryTest()'的?除了那个分配内存的函数之外还有什么东西吗? – NoobsArePeople2 2012-08-06 23:29:29