如何强制JSF清理它的状态管理器



更具体地说,这是Richfaces 3.1. homadepatch/JSF1.1中的AjaxStateManager。我不负责这些技术选择,我已经阅读了相关的问题,如1、2、3,基本上是建议升级版本或切换到无状态JSF,如果可以的话,我很乐意这样做,但由于应用程序的巨大,我担心我不能这样做。

回到主题,我目前正在尝试优化内存堆消耗。由于我的前辈为几乎每个bean设置了会话范围,并设置了6小时的服务器超时(在浏览器中过期之前刷新一些javascript),用户的会话非常长,并且不断积累内存。我自己做了一些优化(这有点像模拟对话范围:当点击一些页面时,我清理主bean中的所有内容)。现在,当用户回到主页时,他们的会话权重约为300kb,分解如下:

    <
  • AjaxStateManager SynchronizedStateHolder美元:280 kb/gh>
  • 会话中其他对象:20kb

这些结果是通过使用Eclipse MAT创建堆转储和分析内存获得的。正如您所看到的,93%的内存是Ajax维护的无用状态。我想强迫它释放那些无用的状态。你知道怎么做吗?

我想过限制它可以保存的视图数,但在某些页面上有一些非常奇怪的形式,我不确定如果我这样做了它会不会破裂。

Thanks in advance.

为了以防万一,这里有一个关于这个问题的相关链接,基本上说没有修复方法,因为它是JSF机制固有的。我使用参数step来表示视图的数量,这样看起来更简洁。

但我也尝试了一些肮脏的修复。我把它贴在那里供将来参考。使用风险自负,因为没有保证。

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();,它就会为您释放内存。但是要注意潜在的副作用,这是实验性代码

相关内容

  • 没有找到相关文章

最新更新