openfire BOSH 內存泄露

   在解決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()方法。

相關文章
相關標籤/搜索