代码之家  ›  专栏  ›  技术社区  ›  defmeta

在AS3中强制垃圾收集?

  •  18
  • defmeta  · 技术社区  · 18 年前

    是否可以通过编程方式强制在ActionScript 3.0中运行完整的垃圾回收?

    假设我已经创建了一组带有eventListeners的显示对象,其中一些DO已被删除,一些EventListener已被触发并删除,等等。。。有没有办法强制运行垃圾收集并收集所有可收集的内容?

    8 回复  |  直到 18 年前
        1
  •  25
  •   BadFeelingAboutThis    14 年前

    是的,这是可能的,但这通常是个坏主意。GC应该比您更清楚什么时候是运行的好时机,并且除了一个非常特殊的情况,比如您刚刚使用了500MB内存,需要尽快将其取回,您不应该自己调用GC。

    System.gc() 方法可以调用(但请不要调用,请参见上文)——记住System.gc()仅在FlashPlayer10+的调试版本中有效。

    this post 格兰特·斯金纳。

        2
  •  15
  •   pnkfelix    14 年前

    有一个新的API告诉GC这可能是一个收集数据的“相对好的时刻”。

    有关详细信息,请参阅Adobe API文档 System.pauseForGCIfCollectionImminent

    还有这个 Adobe blog post

    该方法采用“紧迫性”论证;基本上,如果您真的希望收集器运行,即使自上次收集以来没有太多活动(当前以分配的字节衡量),并且您输入了大量数据(接近1.0),您也可以输入少量数据(接近0.0)如果您只希望在我们已经接近采集点的情况下发生采集暂停。

    一个非常重要的细节:这个新的API同时受到版本和调试器Flash运行时的支持。这使其优于调用System.gc()。

        3
  •  8
  •   Marc Hughes    18 年前

    对于所有当前发布的版本,System.gc()仅适用于Flash player和ADL(AIR应用程序的调试环境)的调试版本。FlashPlayer10Beta目前在所有版本中都能正常工作。

    我同意Davr的观点,这是个坏主意。运行时通常比您有更好的想法。

        4
  •  3
  •   Philippe    18 年前

    正如其他人所说:不要尝试手动GC,虽然有黑客攻击,但并不安全。

    回收 对象时,您将节省大量内存。

    例如,这可以应用于位图数据(清除并重用)、粒子(从显示中删除并重用)。

        5
  •  3
  •   FredV    16 年前

    我有一个评论说,你永远不应该做GC手动。我习惯于C++中的手动内存管理,我更喜欢ScReDTPR,而不是GC。

    有一种特殊情况,我无法找到除GC之外的其他解决方案。请考虑:我有一个DataCache类,它的工作方式是为某些方法调用保留结果对象,这些方法调用在刷新/接收数据时发送更新的事件。刷新缓存的方式是,我只是从缓存中清除所有结果,然后发送事件,该事件会导致任何剩余侦听器重新请求其数据,超出范围的侦听器不应重新请求,从而清除不需要的结果。但是很明显,如果我不能强制所有仍然挂起等待GC立即清理的侦听器在发送“再次询问数据”事件之前,这些挂起的侦听器将不必要地再次请求数据。因此,由于AS3没有析构函数,所以我无法移除VentListener,因此我看不到比强制GC确保不再有悬空侦听器更简单的解决方案。

    <mx:DataGrid id="mygrid" dataProvider="{DataCacher.instance().result('method').data}" ... />
    

    当包含此datagrid的弹出窗口关闭时,您可能希望绑定被销毁。很显然,他们生活得很好。嗯,当一个对象正在运行时,flex不应该破坏它的所有绑定(也就是eventlisteners)吗 标记 用于GC,因为最后一个引用已删除。这对我来说可以解决问题。

    至少这就是为什么我认为,我仍然是Flex的初学者,所以任何想法都将受到赞赏。

        6
  •  3
  •   Kirk Woll    15 年前
    try {
        new LocalConnection().connect('foo');
        new LocalConnection().connect('foo');
    } catch (e:*){
        trace("Forcing Garbage Collection :"+e.toString());
    }
    
        7
  •  0
  •   Alexander Fradiani    16 年前

    如果有必要,打电话给gargabe催收员可能会很有用。。。所以,你必须小心如何以及何时去做,但毫无疑问,有时是必要的。

        8
  •  0
  •   jaredy    15 年前

    回收并没有真正的帮助。我使用了一个加载器,每500毫秒重复加载相同的jpg。任务管理器仍报告内存持续增加。

    这里提供了久经考验的解决方案。

    http://simplistika.com/as3-garbage-collection/

    推荐文章