2

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

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

事实是:

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

到目前为止,我的结论是:

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

我的要求:

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

谢谢

4

2 回答 2

2

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

修复 blazeds 内存泄漏

于 2014-08-24T10:00:54.673 回答
0

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

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

于 2013-04-04T13:32:32.127 回答