2011-01-30 55 views
2

問候,自組織樹內存使用

我有豐富的面孔應用程序(3.3.2.SR1)。該應用程序使用ModelPanel來查看實體。直到我想要顯示它們(呈現= false),所有模態面板纔會呈現。應用程序變得很大,並且從一個面板到另一個面板使用很多關係。所有工作都很好,但是如果組件rendred爲true或false,則它看起來像richfaces在內存中爲所有可能的情況創建UIComponent樹。當我試圖檢查應用程序的內存使用情況時(我使用YourKit Java Profiler來滿足這些需求),我發現它爲一個會話使用了大量內存。

我使用的Facelets連同RichFaces和我試圖用

<c:if test="rendred condition"... /> content </c:if> 

它開始使用顯著更少的內存,但是...... 當我重新描繪用面板方面,主畫面上的控件停止上班。我懷疑這是因爲每次組件樹被改變時它重新創建整個樹,並且我有非同步的客戶端(html)和服務器(面)部分。

有人可以告訴我如何減少內存使用量嗎?由於HeapMemory中的StandardSession對象使用60-150Mb,所以我遇到了實際問題。幾乎所有這些內存都用於UIControls。問題的

例子:

我有參考了PANEL1,是Panel2,·Panel3中頁。

面板是:

<rich:modalPanel > 
    <a4j:outputPanel layout="block" 
      rendered="#{PanelBeanHolder.renderedViewScreen}"> 
     <ui:insert name="panelContent" /> 
    </a4j:outputPanel> 
</rich:modalPanel> 

我只是渲染面板執行此操作時。並且不想在輸出面板上加載UI控件直到我需要它。

預先感謝您。

P.S.我試着做下面的改善情況

配置的意見在會議數web.xml中有:

<context-param> 
    <param-name>com.sun.faces.numberOfViewsInSession</param-name> 
    <param-value>4</param-value> 
</context-param> 

<context-param> 
    <param-name>com.sun.faces.numberOfLogicalViews</param-name> 
    <param-value>4</param-value> 
</context-param> 

它具有改善的StateHolder對象,但它並不能幫助了很多。當這些數字增長時,我測量和記憶的使用量正在增長。但是,當我厭倦將它們設置爲1,1時,有些頁面停止了工作。有時請求被轉發到歡迎頁面。 2,2改善了這種情況,但轉發到歡迎頁面的問題仍然存在。

嘗試使用在javax.faces.STATE_SAVING_METHOD中使用客戶端模式。它仍然爲UIComponent模型使用大量內存。即使對象被序列化並且必須存儲在表單中。

試過重寫stateManager 在faces.config:

<state-manager>org.ajax4jsf.application.CompressAjaxStateManager</state-manager> 

和重寫buildViewState和restoreView用於壓縮流。 這並沒有什麼幫助。

回答

3

JSF使用在請求之間維護的有狀態組件樹。默認情況下,這通常在會話中保留。有些功能可以用來控制此功能。

配置狀態保存參數

通常有實現特定的參數來控制存儲在會話視圖的數量 - 這取決於你的應用程序的行爲,這可能是一個輕鬆取勝。

您可以使用javax.faces.STATE_SAVING_METHOD參數將表格保存爲表格。但是,請注意,您爲每個請求發送更多信息,並且存在允許客戶端指定服務器端狀態的安全風險(確保您對實現如何加密此數據感到滿意)。您需要檢查與組件庫(即RichFaces)的兼容性,尤其是在使用AJAX的情況下。

JSF 2使用一種新的狀態保存機制來減少會話開銷;您的faces-config.xml將需要更新到2.0版本。我相信這個想法來自Apache Trinidad,所以你可能能夠從那裏提取一個JSF之前的版本。

做你自己的狀態保存和/或視圖創建

實現自己StateManager和/或ViewHandler讓你接手的意見是如何處理的編程控制。例如,您可以編寫一個StateManager,將視圖保留到數據庫(具有適當的超時和清理)。

使用組件綁定和瞬態控制

可以接管如何創建組件編程控制。從綁定規範:

  • 首次創建組件實例(通常憑藉在JSP頁面由UIComponentELTag被引用),JSF實現將檢索ValueExpression的名稱綁定,請撥打getValue()就可以了。如果此調用返回非空值UIComponent值(因爲JavaBean已經編程實例化並配置了一個組件),那麼該實例將被添加到正在創建的組件樹中。如果調用返回null,則會創建一個新組件實例,並將其添加到組件樹中,並在ValueExpression上調用setValue()(這將導致JavaBean上的屬性設置爲新創建的組件實例)。
  • 在請求處理生命週期的還原視圖階段重新創建組件樹時,對於與名稱「綁定」相關聯的ValueExpression的每個組件,將調用setValue(),傳遞重新創建的組件實例。

你也許可以用transient屬性中使用兒童來控制編程控制的子組件創建/銷燬。這是手動和有點混亂,但可能在極端情況下工作。

我確定這不是一份詳盡的清單。

+1

+1這是一個很好的解釋。尤其是JSF 2在局部狀態保存功能方面似乎是一個相當巨大的勝利。當編寫你自己的組件時,JSF 2也大大簡化了處理狀態的API(當然這對TS沒有幫助)。我還想補充一點,實現自己的StateManager實際上是一個高級主題,除非您對JSF API感到滿意,否則不應該輕鬆地完成。 – 2011-01-30 18:55:32