Flex为大数据消耗大量内存

时间:2013-02-24 12:33:39

标签: flex memory-management memory-leaks arraycollection

当使用大量数据处理flex数组收集时,例如2,00,000个新引用的对象,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和array中,但问题仍然存在。有人可以解释一下flex消耗多余内存的位置吗?

2 个答案:

答案 0 :(得分:1)

向操作系统请求内存非常耗时,因此Flash播放器会请求大块内存(超过实际需要的内存),以便最大限度地减少这些请求的数量。

答案 1 :(得分:0)

我不知道操作系统分配时间是否已经成为一个大问题,我们正在谈论平均1.5-2GHz Cpu - 甚至移动。但是Benoit正走在正确的轨道上。一次保留大块以主要避免堆碎片。如果仅在一次需要的大小块中请求内存,则与其他IO请求一起,系统内存将非常快速地变得高度分散。当这些片段返回到OS空间时 - 除非内存管理器获得相同大小或更小的请求,否则它无法重新分配此块 - 从而使其丢失到可见池中。所以为了避免这个问题 - Flash(以及它的内存管理器)一次请求16Mb。

在您的情况下,如果您创建了1个对象或100,000,则无关紧要。您仍将从最初的16Mb私有内存开始(也就是您在任务管理器中看到的内容)。

Flash播放器分配机制基于Mozilla MMgc 您可以在此处阅读:https://developer.mozilla.org/en-US/docs/MMgc