0

当使用大量数据(例如 2,00,000 个新引用的对象)处理 flex 数组集合时,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在哪里消耗了这些多余的内存吗?

4

2 回答 2

1

向操作系统请求内存非常耗时,因此 Flash 播放器请求大块内存(超过它实际需要的内存)以最小化这些请求的数量。

于 2013-02-24T12:54:46.650 回答
0

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

在您的情况下,您创建 1 个对象还是 100,000 个对象都没有关系。你仍然会从至少 16Mb 的私有内存开始(也就是你在任务管理器中看到的)。

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

于 2013-02-24T20:11:28.800 回答