【问题标题】:Flex consuming huge memory for large dataFlex 为大数据消耗大量内存
【发布时间】:2013-02-24 12:33:38
【问题描述】:

当使用大量数据(例如 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 在哪里消耗了这些多余的内存?

【问题讨论】:

  • 你为什么称它为“泄漏”?

标签: apache-flex memory-management memory-leaks arraycollection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2014-01-04
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多