簡體   English   中英

如何強制JSF清理其State Manager?

[英]How to force JSF clean its State Manager?

更具體地說,這是Richfaces 3.1.HomeMadePatch / JSF1.1中的AjaxStateManager。 我不負責這些技術的選擇,我已經看過相關的問題,如123基本上建議升級版本或切換為無狀態的JSF,我會很高興,如果我能做到,但由於應用程序巨大,我恐怕無法做到這一點。

返回主題,我目前正在嘗試優化內存堆消耗。 由於我的前輩幾乎為每個bean設置了一個會話范圍,並且將服務器超時設置為6小時(在瀏覽器中有一些JavaScript刷新才能過期),因此用戶會話時間很長,並且會不斷累積內存。 我自己進行了一些優化(嗯,這是一種模擬對話范圍的方法:點擊某些頁面時,我會清理主bean中的所有內容)。 現在,當用戶返回主頁時,其會話帶寬約為300kb,細分如下:

  • AjaxStateManager $ SynchronizedStateHolder:280kb
  • 會話中的其他對象:20kb

通過制作heapdump並使用Eclipse MAT分析內存來獲得這些結果。 如您所見,93%的內存是Ajax維護的無用狀態。 我想強迫它釋放那些無用的狀態。 關於如何做到這一點的任何想法?

我曾考慮過限制它可以保存的視圖數量,但是在某些頁面中有一些非常奇怪的形式限制,我不確定如果這樣做的話它不會破裂。

提前致謝..

好的,以防萬一,這里是有關該問題的相關鏈接 ,基本上說沒有修復,因為它是JSF機制固有的。 我對視圖數量采取了參數步驟,這似乎更干凈。

但是我也嘗試了一些骯臟的修復方法。 我將其張貼在那里以備將來參考。 使用該工具需要您自擔風險,因為不能保證。

package com.mycompany.ajaxutils;

import javax.faces.application.StateManager;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.ajax4jsf.application.AjaxStateManager;
import org.ajax4jsf.util.LRUMap;

public class AjaxStateHelper {
    private static final AjaxSateManagerUncover asmu = new AjaxSateManagerUncover(null);

    public static void cleanAjaxStateManager() {
        HttpSession currentSession = (HttpSession) FacesContext.getCurrentInstance().getExternalContext()
                .getSession(false);
        LRUMap lrumap = asmu.getLRUMap(currentSession.getAttribute(AjaxStateManager.class.getName()
                + ".VIEW_STATES_MAP"));
        lrumap.clear();
    }

    /**
     * This inner class is needed because we need to make a cast to a SynchronizedStateHolder
     * which is an inner protected class inside AjaxStateManager
     */
    protected static class AjaxSateManagerUncover extends AjaxStateManager {

        public AjaxSateManagerUncover(StateManager parent) {
            super(parent);
        }

        public LRUMap getLRUMap(Object stateMap) {
            SynchronizedStateHolder s = (SynchronizedStateHolder) stateMap;
            return s.getStateMap();
        }
    }
}

只需調用AjaxStateHelper.cleanAjaxStateManager(); 從應用程序中任何您需要的位置,它都會為您釋放內存。 但是要當心潛在的副作用,這是實驗代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM