当使用大量数据处理flex数组集合时,例如200000个新引用的对象,flex客户端浏览器中的内存会激增20MB。这个多余的20MB与对象中定义的变量无关。下面展示了一个详细的示例。
var list:ArrayCollection = new ArrayCollection;
for(var i:int = 0;i<200000;i++)
{
var obj:Object = new Object;
list.add(obj);
}
在执行上述代码时,flex客户端浏览器内存增加了20MB。对于另一个场景,我尝试将一个动作脚本对象添加到数组集合中。动作脚本对象定义如下。
public class Sample
{
public var id:int;
public var age:int;
public Sample()
{
}
}
在向数组集合中添加200000 Sample类时,仍然存在20MB内存泄漏。
var list:ArrayCollection = new ArrayCollection;
for(var i:int = 0;i<200000;i++)
{
var obj:Sample = new Sample;
obj.id= i;
onj.age = 20;
list.add(obj);
}
我甚至尝试将示例对象添加到flex arrayList和数组中,但问题仍然存在。有人能解释一下flex在哪里消耗了多余的内存吗?
向操作系统请求内存非常耗时,因此Flash播放器会请求大量内存(超过实际需要(,以最大限度地减少这些请求的数量。
我不知道操作系统分配时间是否再重要了,我们谈论的是平均1.5-2GHz的Cpu,甚至是移动设备。但伯努瓦走在了正确的轨道上。一次保留大块,主要是为了避免堆碎片。如果一次只请求所需大小的内存块,以及其他IO请求,系统内存将很快变得高度碎片化。当这些片段返回到操作系统空间时——除非内存管理器收到相同大小或更小的请求,否则它无法重新分配这个区块——从而使其丢失到可见池中。因此,为了避免这个问题,Flash(及其内存管理器(一次请求16Mb。
在您的情况下,创建1个对象或100000个对象都无关紧要。您仍然可以从最低16Mb的专用内存(也就是您在任务管理器中看到的内存(开始。
flash播放器的分配机制基于Mozilla MMgc
你可以在这里阅读:https://developer.mozilla.org/en-US/docs/MMgc