【问题标题】:Garbage collecting third-party SWF in AIRAIR 中的垃圾收集第三方 SWF
【发布时间】:2012-07-28 00:36:21
【问题描述】:

考虑一个 AIR 应用程序,它可以一次加载任意数量的第三方 SWF 文件进行显示。就像一个网络浏览器。

问题是这些 SWF 文件可能有尚未删除的 EventListener 等。

Loader.unloadAndStop() 是否足以垃圾收集这些 SWF?

如果没有 - 是否有一种方法可以(可能每个 SWF 都有一个新的 NativeWindow,然后在完成后关闭 NativeWindow。这会完全 GC 吗?)

【问题讨论】:

  • 您可以调查覆盖 addEventListener 以保留侦听器列表。但是,如果对象正在侦听舞台,您可能很难用自己的一个来覆盖默认的舞台实例。

标签: actionscript-3 flash apache-flex air


【解决方案1】:

不久前,我在没有源代码的外部开发组件方面遇到了类似的问题,它被夹在了我们的应用程序中。我能做/想到的最好的事情就是做核工业所做的事情 - 当事情变糟时,至少将它包含在混凝土中,这样它就不会传播得比它必须的更多

我的解决方案是建立一个“组件池”,以便在要求“清洁”受污染的对象时将它们放在单独的存放区域中,以便在需要时重复使用 - 这样只会创建所需的最少数量在运行会话期间。

【讨论】:

  • 这会在外部内容中包含内存泄漏吗?
  • 是的,前提是您的应用程序仅使用了受影响区域的最低限度。例如,在那个项目中,我们基于模板中的页面构建了一个 CMS。使用标准方法,页面将被拆除,并在其位置构建“新”以用于新请求。使用池方法,如果您已经创建了 3 并持有它的参考,现在请求 5 - 只构建了另外 2 个“新”。因此泄漏量取决于使用情况,但它通常将自身建模为 ln(e)。
  • 我的理解是,无法包含内存泄漏的已加载资产(您无法控制其来源)的使用,并且无论如何都可能增长。此外,在 cms 的示例中,您可能需要在打开包含元素时重置资产,并且重置只能通过重新加载可靠地发生。
  • 在这种特定情况下,分析器和游荡对象视图都确认,虽然内存会上升,但它不会随着每个连续的“冲洗重复”操作而任意上升。它只会随着对一个它还没有的新受污染对象的连续请求而上升。在这种情况下,重置任何现有数据很容易,因为与它交互的相同方法与创建它然后设置它相同。每个元素都是不同的 - 但我们处理的视图不像在 mouse.move 事件期间添加另一个侦听器那样明显。
【解决方案2】:

单独的本机窗口或在浏览器控件中加载可能是您无法控制的第三方 SWF 的一种方式。否则这会增加很多开销。

不幸的是,您无法确保加载代码的正确沙盒(显示对象,最重要的是,阶段不能从加载的代码中隐藏)。如果加载的代码在舞台上添加了一个监听器(如果您需要键盘事件,这很常见),那么它不会卸载。

然而,这在 SWF 格式本身不同的移动设备上是不可能的。

【讨论】:

  • NativeWindow 在关闭时会完全 GC,即使第三方 SWF 正在做最坏的行为?
【解决方案3】:

您应该在 GC 之前创建一个公共静态函数来删除加载的 swf 文件中的所有侦听器。

【讨论】:

  • 如原始问题所述,这些是针对第三方 SWF 的,即我不了解或控制其中的听众
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多