openfireボスメモリが漏洩しました.
921 ワード
openfireボスを解決する一つのバグの中で、偶然にopenfireボスがメモリ漏れをしていることを発見しました.
先にjmapコマンドを提供してメモリの漏洩を追跡します.
ここでは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の方法です.
先に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の方法です.