0

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

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

  • AjaxStateManager$SynchronizedStateHolder:280kb
  • 会话中的其他对象:20kb

这些结果是通过使用 Eclipse MAT 进行堆转储和分析内存获得的。如您所见,93% 的内存是 Ajax 维护无用状态。我想强制它释放那些无用的状态。关于如何做到这一点的任何想法?

我考虑过限制它可以保存的视图数量,但在某些页面中有一些非常奇怪的形式重叠,我不确定如果我这样做它不会破坏。

提前致谢..

4

1 回答 1

0

好的,以防万一,这里有一个关于该问题的相关链接,基本上说没有修复,因为它是 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(); 从应用程序中需要它的任何位置调用,它就会为您释放内存。但要注意潜在的副作用,这是实验代码

于 2014-05-20T13:20:35.413 回答