2

Flex アプリケーションでメモリ リークが発生しています。Flex アプリケーションは、大きな Web アプリケーションの一部です (内部にはあらゆる種類のテクノロジが組み込まれています)。

Flex アプリがサーバーから 5 秒ごとに更新ポーリングを呼び出すと、メモリ リークが発生します。

事実は次のとおりです。

  • 接続にはAMFChannelを使用しています。ポーリングは偽です。リフレッシュするたびに、新しいAMFChannelインスタンスが作成されます。
  • サーバー側はBlazeDSで、Web アプリケーション内でサーブレットとして実行されます。
  • メモリ リークは、IEおよびFireFoxで発生します。Chromeではまったく発生しません。
  • 一晩で IE メモリが数百 MB 増加し、最終的にはクラッシュします。
  • Flex では、メモリは増加しますが、はるかに遅くなります。一晩で 30MB 増加します。
  • Flex プロファイラーを使用すると、増加したメモリがAMFChannelsに関連していることがわかりました。
  • AMFChannel requestTimeoutを 60 秒に設定しようとしました。何もしませんでした。
  • BlazeDS connect-timeout-secondsを 60 秒に設定しようとしました。何も変わっていません。しかし、私はそれを正しくやったかどうかわかりません。

これまでの私の結論は次のとおりです。

  • AMFChannel は、実際にはブラウザーから接続を取得します。Flex では、AMFChannel が消費するメモリはわずかですが、ブラウザではより多くのメモリが消費されます。これは、Flex アプリと IE の間で消費されるメモリの違いを説明しています。
  • どういうわけか、AMFChannel はシャットダウンされておらず、ガベージ コレクションも行われていません。

私の要求:

  • 私の結論は正しいですか?
  • AMFChannel がシャットダウンされ、クリーンアップされていることを確認するにはどうすればよいですか?
  • クライアントの接続インスタンスは BlazeDS (サーバー側) によって制御されていますか?
  • この問題の調査を続けるのに役立つその他の手がかり

ありがとう

4

2 に答える 2

2

私たちも同じ問題を抱えています。JVM は 24 ~ 50 時間ごとにメモリ不足になります。JVM 側の問題に対する有効な修正を文書化しました。

blazed のメモリ リークを修正する

于 2014-08-24T10:00:54.673 に答える
0

すべてのオブジェクトと同様に、ある時点でポインターを null として宣言して、GC の対象にする必要があります。AMFChannel オブジェクトを使用する場合、これに対する最善の方法は、channelDisconnectchannelFaultイベントの両方にリスナーを設定することです。これらのイベント ハンドラーのいずれかからインスタンスへのクラス メンバー参照がある場合は、それを null と宣言します。

クライアント側から disconnect を呼び出す必要があるかどうかを判断するには、次のプロパティを確認できます: shouldBeConnected および connected.

于 2013-04-04T13:32:32.127 に答える