在解決openfire BOSH的一個bug中,偶然發現openfire BOSH有內存泄露的狀況。shell
先提供一個jmap命令來跟蹤內存泄露:session
jmap -histo:live $OPID | grep HttpSession
$OPID是openfire的進程號。 HttpSession是openfire BOSH重要的數據結構和邏輯處理模塊。數據結構
這裏不介紹openfire BOSH的具體邏輯。只會簡單的說明一下幾個對象之間的關係:code
1) 當一個client鏈接到openfire BOSH接口後,就會有一個HttpSession來負責處理全部和這個client之間的消息交互。server
2) 一個HttpSession包含一個HttpConnection隊列。client和server之間的每個交互對應一個HttpConnection。對象
3)server維護了一個全局的map來保存全部的HttpSession。接口
當client由於某種緣由斷開和BOSH的鏈接,發現和這個client相關的HttpConnection/HttpSession並無被釋放。隊列
緣由是什麼那?進程
最直接的緣由是當HttpSession中斷後,server並無把這個session從map刪除掉。內存
爲何沒有被刪除掉?
緣由是server在清理這個HttpSession以前,拋異常了,致使清理Session工做沒有被執行。
因此咱們要catch住這個異常,讓server正常的清理session。
具體的方法是在HttpSession中的closeConnection()方法。