2013-10-02 71 views
4

我有一個Web應用程序,它產生了很多後臺工作線程來響應對某個端點的請求。爲了讓工作人員的狀態更加透明,我添加了一個工作人員可以發佈活動的活動巴士。事件被推入地圖,隨着時間的推移跟蹤每個工作人員的狀態。定期將地圖快照並推送到更持久的位置,其中快照通過請求令牌與請求關聯。何時收集Google Guava EventBus對象垃圾?

它確實有吸引力給每個請求自己的事件總線。然後每個請求都有自己的地圖。當請求完成並且最終快照被推送時,地圖和事件總線超出範圍並因此被垃圾收集。

至少,這是理論。但是我曾經討論過的一些人提出,即使只有明確的引用超出了範圍,事件總線也不會被收集,因爲它在設置過程中爲其自身創建了其他引用。我真的很感激更有經驗的Java/Guava從業者的觀點。

+1

我無法在文檔中找到類似的東西....: - |你的消息來源可信嗎? – Thihara

+0

我也看到事件處理後線程沒有被釋放。希望對此有任何意見。 – RohanRasane

回答

3

沒有什麼能夠阻止EventBus對象在沒有更多引用時被垃圾回收。你可以看看source code

什麼他們可以被提及的是,EventBus有幾個被EventBus實例之間共享static緩存的事實。那些不會被垃圾收集。緩存做兩件事情:

  • EventBus.flattenHierarchyCache保持地圖的一類(類型的用戶的方法訂閱事件)所設定的所有類和接口,每個接口這些類的擴展或實現的。
  • AnnotatedSubscriberFinder.subscriberMethodsCache將類(具有訂閱者方法的類)的映射保留到註釋爲@Subscribe的那些類上的方法。

這些緩存的大小是由不同類型的事件您張貼到每個EventBus和數量不同類別你每EventBus註冊的數量的限制。因此,例如,如果您只發布一種類型的活動,並且只有一個註冊您的活動巴士的課程,那麼緩存將很小,並且會保持這種狀態。