2013-04-04 2 views
1

Я столкнулся с утечкой памяти в приложении Flex. Приложение Flex является частью большого веб-приложения (со всеми видами технологий внутри).Утечка памяти в приложении Flex

Утечка памяти происходит, когда приложение Flex вызывает обновление опроса с сервера каждые 5 секунд.

Факты таковы:

  • Я использую AMFChannel, чтобы сделать соединение. Опрос неверен. Каждое обновление создает новый экземпляр AMFChannel.
  • Серверная сторона BlazeDS, работающая как сервлет внутри моего веб-приложения.
  • Утечка памяти происходит на IE и FireFox. Это не происходит вовсе на Chrome.
  • За одну ночь память IE увеличилась на сотни МБ и в итоге рушится.
  • В Flex память увеличивается, но намного медленнее. За ночь он увеличится на 30 МБ.
  • Используя профилировщик Flex, я увидел, что увеличенная память связана с AMFChannels.
  • Я попытался установить AMFChannel requestTimeout to 60 sec. Он ничего не сделал.
  • Я попытался установить BlazeDS connect-timeout-seconds to 60 sec. Ничего не изменилось. Но я не уверен, что сделал это правильно.

Мои выводы до сих пор являются:

  • AMFChannel на самом деле получает соединения из браузера. В Flex AMFChannel потребляет небольшой кусочек памяти, в то время как в браузере он потребляет гораздо больше. Это объясняет разницу в потребляемой памяти между приложением Flex и IE.
  • Как-то AMFChannel не выключается, а не собирается мусор.

Мои запросы:

  • ли мои выводы не так ли?
  • Как убедиться, что AMFChannel выключен и очищен?
  • Является ли экземпляр подключения на клиенте управляемым BlazeDS (на стороне сервера)?
  • Любой другой ключ, чтобы помочь мне продолжить расследование этому вопросу

Благодарности

ответ

1

У нас также есть та же проблема. JVM выходит из памяти каждые 24 - 50 часов. Я зарегистрировал рабочее исправление проблемы на стороне JVM.

Fixing blazeds memory leak

0

Как и все объекты, в какой-то момент указатели должны быть признаны недействительными, чтобы сделать его пригодным для GC.С помощью объекта AMFChannel ваш лучший способ - настроить прослушиватели для событий channelDisconnect и channelFault. Если у вас есть ссылка на экземпляр класса, из любого из этих обработчиков событий вы объявляете его нулевым.

Чтобы определить, следует ли вызывать разъединение с клиентской стороны, вы можете посмотреть на свойства: shouldBeConnected и connected.

+0

Спасибо, что ответили. Если AMFChannel не является бесплатным в Flex, вызывает ли он объект соединения в IE, чтобы он не работал? –

+0

Я добавил вручную отключить вызов к каждому удаленному объекту, который живет более 1 минуты. Похоже, что память Flex стабильна, но память IE продолжает расти. –