[英]How to force JSF clean its State Manager?
更具體地說,這是Richfaces 3.1.HomeMadePatch / JSF1.1中的AjaxStateManager。 我不負責這些技術的選擇,我已經看過相關的問題,如1 , 2 , 3基本上建議升級版本或切換為無狀態的JSF,我會很高興,如果我能做到,但由於應用程序巨大,我恐怕無法做到這一點。
返回主題,我目前正在嘗試優化內存堆消耗。 由於我的前輩幾乎為每個bean設置了一個會話范圍,並且將服務器超時設置為6小時(在瀏覽器中有一些JavaScript刷新才能過期),因此用戶會話時間很長,並且會不斷累積內存。 我自己進行了一些優化(嗯,這是一種模擬對話范圍的方法:點擊某些頁面時,我會清理主bean中的所有內容)。 現在,當用戶返回主頁時,其會話帶寬約為300kb,細分如下:
通過制作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.