2013-03-07 26 views
13

由Servlet容器自身管理,因爲它們是基本上爲HttpRequestHttpSession屬性分別存儲在@RequestScoped@SessionScopedBean管理豆的生命週期。 JSF如何管理@ViewScopedBean的生命週期?我知道它是在創建視圖時創建的,並且可以使用,直到有回發到不同的視圖。但是我發現,在我們從這個觀點出發後,並不是立即收集垃圾。如何以及何時在JSF中銷燬@ViewScoped bean?

+0

一旦託管bean操作方法返回有效的導航案例結果,即使它是相同的視圖,視圖作用域託管bean也將被重新創建並重新創建。閱讀這個http://balusc.blogspot.co.il/2011/09/communication-in-jsf-20.html,這是他們存儲的地方:http://stackoverflow.com/a/9177769/617373 – Daniel 2013-03-07 07:33:00

+0

那麼,在現實中,你不應該能夠預測gc或讓它立即發生嗎?但是關於mojarra中的viewscoped beans,請參閱http://stackoverflow.com/a/13097208/1530938 – kolossus 2013-03-07 12:15:28

+0

垃圾回收是異步的。當視圖範圍被「銷燬」時,它就像所有其他Java對象一樣,只是「標記爲準備垃圾收集」。注意:標記實際上是0的參考計數(即標記爲「不再使用」)。 – DwB 2013-03-13 16:54:34

回答

23

當已經執行

  • 具有非null結果回發它就會被破壞,

  • ,或者在會話(邏輯)視圖的數目已經超過與該特定視圖是LRU鏈中的第一個(在Mojarra中,可由com.sun.faces.numberOfViewsInSessioncom.sun.faces.numberOfLogicalViews上下文參數配置,每個默認值爲15),

  • 或nu在會話中有很多actieve視圖範圍已經超出(在Mojarra,這是一個硬編碼限制25),另請參見JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?

  • 或者,會話已過期。

它將因此被當頁面被卸載,只需點擊某個鏈接GET到另一個頁面,或刷新頁面,或者關閉瀏覽器標籤/窗口的結果破壞。豆子會一直存在,直到滿足一種高度的條件。無論如何要在卸載時銷燬它,請考慮使用OmniFaces @ViewScoped

+0

你是什麼意思的LRU?最近最少使用?還有你的意思是什麼?邏輯*視圖? – Geek 2013-03-13 17:15:48

+2

1)是的。它們存儲在一個LRU地圖中,按照上次使用的順序排列。最近最少使用的是第一個條目。 2)請參閱http://stackoverflow.com/questions/12562469/how-can-i-set-the-view-timeout/12564632#12564632 – BalusC 2013-03-13 17:18:01

+0

@BalusC,有沒有任何解決方案去糟糕的豆離子更快?將底層viewscoped註釋幫助嗎? – 2014-09-27 10:04:22