2012-07-12 28 views
5

很明顯,在某個時候一個對象被創建並被銷燬/返回到池中。我特別感興趣的是如何收集這些垃圾。有沒有辦法來控制這種行爲?具體來說,將打電話給invalidate()標記這些對象進行收集?他們什麼時候釋放存儲在其中的任何引用?Java HttpSession對象的生命週期是什麼?

越詳細越好。

回答

8

HttpSession基本上是一個從字符串鍵到某個任意值的映射。每次創建會話時(通過訪問JSP或致電getSession()/getSession(true)),容器將生成唯一的字符串會話ID並保存對該對象的引用。同樣,它將使用從會話ID到HttpSession對象的地圖。

一旦您在會話中放入了某些東西,容器就會保存對該會話的引用,並且會話將持有對您的對象的引用。它會留在那裏一段時間。有三種情況,當你的項目將從會議中刪除:

  1. 當你明確地將其刪除(removeAttribute()setAttribute(null)

  2. 當你invalidate()整個會話。這基本上刪除所有屬性並從容器管理的會話映射中刪除整個會話

  3. 當會話到期時(與2相同的行爲)。當沒有servlet/JSP訪問會話時(例如10分鐘)

當下一個對象從會話中刪除(上述任何點)和無其他代碼的保持對該對象的引用,它是符合垃圾回收,並且將下一個GC運行過程中除去。


您可以添加實現了HttpSessionBindingListenerHttpSession中遵守上述的一些行爲的對象。例如,實現此接口的對象可以在會話中解除綁定時打印日誌消息。您可以查看documentation here

1

我認爲這取決於你使用的容器,實現的問題。