Flex应用程序中的内存泄漏

时间:2013-04-04 09:30:00

标签: flex memory-leaks blazeds

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

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

事实是:

  • 我正在使用 AMFChannel 进行连接。投票是错误的。每次刷新都会创建新的 AMFChannel 实例。
  • 服务器端是 BlazeDS ,在我的Web应用程序中作为servlet运行。
  • 内存泄漏发生在 IE FireFox 上。它不会出现在 Chrome 上。
  • 一天晚上,IE内存增加了数百MB,并最终崩溃。
  • 在Flex中,内存确实增加但速度要慢得多。它过夜了 将增加30MB。
  • 使用Flex Profiler,我看到增加的内存与之相关 AMFChannels
  • 我尝试将 AMFChannel requestTimeout 设置为60秒。它没有做任何事。
  • 我尝试将 BlazeDS connect-timeout-seconds 设置为60秒。没有改变。但我不确定我做得对。

到目前为止我的结论是:

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

我的要求:

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

由于

2 个答案:

答案 0 :(得分:2)

我们也有同样的问题。 JVM每24到50小时内存不足。我已经记录了JVM端问题的工作修复。

Fixing blazeds memory leak

答案 1 :(得分:0)

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

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