2016-04-07 39 views
0

我有一個JSF應用程序和@ViewScoped bean。這是viewScoped,因爲我做了一些Ajax請求。JSF ViewScoped OutOfMemoryException

我將大量數據加載到視圖中並將其顯示給用戶。

今天我進行了負載測試,並遇到OutOfMemoryException。事實證明,當我打開網頁,@PostConstruct被稱爲

bean created. ID = @54a35e23

現在我導航到另一個頁面,並再次返回(@PreDestroy不叫),然後我得到

bean created. ID = @fee0948

我在負載測試中重新做了這個。幾個小時後,我有OutOfMemoryException

當我導航到另一個頁面時,我能以某種方式強制JSF銷燬我的ViewScoped bean嗎?

+0

你使用CDI還是打開? OmniFaces @ ViewScoped'在onload期間顯式銷燬bean和關聯的JSF視圖狀態。但它需要CDI。另請參閱http://showcase.omnifaces.org/cdi/ViewScoped – BalusC

+0

我使用java ee 6並且沒有CDI。另外我非常接近上線,所以我不想改變很多。沒有其他辦法嗎? – matthias

+0

JSF(Mojarra)在會話中保留最多25個視圖範圍的bean。改變它的內存空間。或者,引入第二級JPA緩存(如果您使用的是JPA)。 – BalusC

回答

0

如果您的ViewScoped bean很龐大,那麼您的實施有問題。你可以添加你的源代碼來查看它。如果你處理的數據量很大,你可能需要像Infinispan或Hazelcast那樣使用內存網格中的東西。

+0

但是當我想在我的頁面中使用一些ajax請求時,我必須使用ViewScope或SessionScope,對吧? – matthias

+0

是的,但我正在談論您在網頁上展示的數據,您展示了哪些組件? –