2011-10-03 22 views
1

我正在與大約300個併發用戶進行企業Web應用程序的性能調整。我從GC日誌中注意到,應用程序堆始終在增長,並且對象始終在完全GC之後累積。我已經獲得了生產堆轉儲,我很驚訝會話對象佔用了堆大小的90%以上!這都是因爲AjaxStateHolderObject。AJAX4JSF/AjaxStateHolder |會話內存泄漏

該應用程序在JSF 1.X和RichFaces 3.3.0上運行。

開始討論之前,我嘗試了以下內容:

  • 下面的代碼添加到web.xml

<context-param>

<param-name>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</param-name>

<param-value>1</param-value>

</context-param>

  • 添加以下代碼到web.xml

<context-param>

<param-name>com.sun.faces.numberOfViewsInSession</param-name>

<param-value>1</param-value>

</context-param>

<context-param>

<param-name>com.sun.faces.numberOfLogicalViews</param-name>

<param-value>1</param-value>

</context-param>

  • 從RichFaces的升級3.3.0至3.3.3

所有上述的嘗試未能解決MEM泄漏問題。

更新

*單個用戶會話可以消耗高達由於AjaxStateHolder規模龐大的25 MB。

*應用程序的大多數託管bean都是請求範圍,會話中沒有未使用的引用對象,關於內存的唯一問題是ajaxStateHolder。

在此先感謝您的任何指導。

任何形式的幫助,將不勝感激,因爲我沒有在網絡上發現任何有關這個問題。

+0

你真的沒有給我們足夠的細節來幫助你。會話可能會很大,但也許這是因爲您的應用服務器正在爲3k個併發用戶提供服務,這是一個很大的問題。單個用戶會話通常消耗多少內存?對象是否存儲在會話中,實際上可能是無狀態的?你是否可以利用視圖作用域來管理一些被管理的bean,以將有狀態範圍限制爲單個頁面?他們未使用的對象是否在不再被讀取或使用的會話託管bean中引用?簡單的配置調整可能在這裏沒有什麼不同。 –

+0

@maple_shaft對不起,只有300個用戶。 :)單個用戶會話最多可以使用25 MB。大多數託管的bean都是請求範圍。會話中沒有未使用的引用對象,關於內存的唯一問題是ajaxStateHolder。 –

+0

任何更新? –

回答

0

看來您已經遇到了JSF/a4j會話內存泄漏缺陷。見下面鏈接查看更多說明此事:

https://issues.jboss.org/browse/RF-3878

看起來好像視圖狀態會被緩存,而不是清理。這是a4j的錯誤,無法修復,只能解決。您添加到web.xml的配置是唯一的建議解決方法,但顯然這並沒有太大的幫助。

看來a4j的擴展性不是很好,所以最好的長期解決方案是將a4j組件慢慢重構出應用程序並將其替換爲不同的組件框架?對不起,我不能提供更多幫助,我希望你好運。

+0

感謝您的回答。 :)請你指導我如何重構/更換a4j組件? –

+0

@ M.ES這對你的情況來說過於複雜和具體,以便給你一個很好的答案。有許多不同的組件框架可以取代a4j:IceFaces,PrettyFaces,Primefaces等等,但是它們也可能有類似的內存管理問題。我的建議是做一個原型並嘗試從單個頁面中刪除a4j,並用另一個框架中的組件替換它。在你的原型中放置檢測代碼並執行負載測試。監視內存使用情況並與a4j進行比較。知道哪個內存管理最好是很有趣的。 –

+1

續......這是JSF的一個常見問題,它似乎並沒有很多關於JSF性能調優的好博客,至少我可以找到它。 –