openfireボスメモリが漏洩しました.

921 ワード

openfireボスを解決する一つのバグの中で、偶然にopenfireボスがメモリ漏れをしていることを発見しました.
   先にjmapコマンドを提供してメモリの漏洩を追跡します.
jmap -histo:live $OPID | grep HttpSession
   $OIDはopenfireのプロセス番号です.HttpSessionはopenfireボスの重要なデータ構造と論理処理モジュールです.
   ここではopenfireボスの具体的なロジックを紹介しません.いくつかのオブジェクト間の関係を簡単に説明するだけです.
   1)clientがopenfire BOSSインターフェースに接続すると、HttpSessionがこのclientとの間のメッセージの相互作用を担当します.
   2)一つのHttpSessionはHttpConnection行列を含む.clientとserverの間の各インタラクションは一つのHttpConnectionに対応します.
   3)serverは全体のmapを維持し、すべてのHttpSessionを保存します.
   clientが何らかの理由でボスとの接続を切断した時、このclientに関するHttpConnection/HttpSessionは解放されていないことが分かりました.
   なぜですか?
   最も直接的な原因は、HttpSessionが中断された後、serverはこのsessionをmapから削除しなかったからです.
   なぜ削除されなかったですか?
   理由はserverがこのHttpSessionを整理する前に投げてしまいました.Sessionを整理する作業が行われていませんでした.
   だから私達はcatchにこの異常を居住して、server正常な整理sessionを譲ります.
   具体的な方法はHttpSessionにおけるclose Connectionの方法です.