2013-02-24 96 views
0

当flex数组集合处理大量数据时,例如20000个新引用的对象,flex客户端浏览器中的内存将增加20MB。这多余的20MB独立于对象中定义的变量。下面是一个详细的例子。为大数据消耗大量内存的Flex

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

你为什么称它为“泄漏”? – ethrbunny 2013-02-24 13:19:14

回答

1

向操作系统请求内存非常耗时,所以Flash播放器需要大量的内存(超过它真正需要的),以便尽量减少这些请求的数量。

0

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

就你的情况而言,如果你创建了1个对象或者100,000个对象并不重要。您仍然会以最少16Mb的私有内存开始(即您在任务管理器中看到的内容)。

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