【问题标题】:Memory leak in Flex applicationFlex 应用程序中的内存泄漏
【发布时间】:2013-03-26 07:17:55
【问题描述】:

我的 Flex 应用程序中存在内存泄漏。 Flex 应用程序是大型 Web 应用程序的一部分(内部包含各种技术)。

当 Flex 应用每 5 秒从服务器调用一次刷新轮询时,就会发生内存泄漏。

事实是:

  • 我正在使用 AMFChannel 进行连接。投票是假的。每次刷新都会创建新的 AMFChannel 实例。
  • 服务器端是 BlazeDS,在我的 Web 应用程序中作为 servlet 运行。
  • IEFireFox 上发生内存泄漏。 Chrome 上根本不会出现这种情况。
  • 一夜之间,IE 内存增加了数百 MB,最终崩溃。
  • 在 Flex 中,内存确实增加了,但速度要慢得多。一夜之间 将增加 30MB。
  • 使用 Flex 分析器我看到增加的内存与 AMF 频道
  • 我尝试将 AMFChannel requestTimeout 设置为 60 秒。它什么也没做。
  • 我尝试将 BlazeDS connect-timeout-seconds 设置为 60 秒。没有改变。但我不确定我做对了。

到目前为止我的结论是:

  • AMFChannel 实际上是从浏览器获取连接。在 Flex 中 AMFChannel 消耗一小块内存,而在浏览器中它消耗更多。这解释了 Flex 应用和 IE 在内存消耗方面的差异。
  • 不知何故,AMFChannel 没有关闭,也没有进行垃圾收集。

我的要求:

  • 我的结论对吗?
  • 如何确保 AMFChannel 已关闭和清理?
  • 客户端上的连接实例是否由 BlazeDS(在服务器端)控制?
  • 任何其他有助于我继续调查此问题的线索

谢谢

【问题讨论】:

    标签: apache-flex memory-leaks blazeds


    【解决方案1】:

    我们也有同样的问题。 JVM 每 24 到 50 小时就会出现一次内存不足。我已经记录了针对 JVM 端问题的有效修复。

    Fixing blazeds memory leak

    【讨论】:

      【解决方案2】:

      像所有对象一样,在某些时候需要将指针声明为 null 以使其符合 GC 条件。使用 AMFChannel 对象,最好的方法是为 channelDisconnectchannelFault 事件设置侦听器。如果您有一个对实例的类成员引用,则可以从这些事件处理程序中的任何一个中将其声明为 null。

      要确定是否应该从客户端调用disconnect,可以查看属性:shouldBeConnected 和connected。

      【讨论】:

      • 感谢您的回复。如果 Flex 中的 AMFChannel 不是空闲的,是否会导致 IE 上的连接对象保持不变?
      • 我添加了手动断开对每个活动超过 1 分钟的 RemoteObject 的调用。看起来 Flex 内存稳定,但 IE 内存继续增长。
      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 2016-03-28
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多