2014-05-14 1 views
0

보다 구체적으로 Richfaces 3.1.HomeMadePatch/JSF1.1의 AjaxStateManager입니다. 때문에에 나는이 기술 선택에 대한 책임을지지 않습니다 오전, 난 이미 버전을 업그레이드하거나 나는 내가 할 수있는 경우에 할 매우 기쁠 상태가없는 JSF에 대한 전환 할 기본적으로 조언 1, 2, 3 같은 관련 질문을 읽을 수 있지만 응용 프로그램의 큰 거친 내가이 일을 할 수 없어 두렵다. 위로 주제에 JSF가 상태 관리자를 강제로 지우려면 어떻게해야합니까?

, 나는 현재 메모리 힙 소비를 최적화하기 위해 노력하고 있습니다. 전임자가 거의 모든 빈에 대해 세션 범위를 설정하고 브라우저에서 만료되기 전에 일부 자바 스크립트가 새로 고쳐지면서 서버 시간 제한을 6 시간으로 설정했기 때문에 사용자는 매우 긴 세션을 가지며 메모리를 계속 누적합니다. 나는 스스로 최적화를했다. (어떤 종류의 페이지를 칠 때, 나는 주 콩에서 모든 것을 깨끗이한다.)

  • AjaxStateManager $ SynchronizedStateHolder : 세션에서 2백80킬로바이트
  • 다른 목적 : 그 결과가 얻어졌다

20KB 사용자가 기본 페이지로 돌아올 때 지금 300킬로바이트 주위에 그들의 세션 wheights는 다음과 같이 분류 Eclipse MAT로 힙 덤프 (heapdump) 및 메모리 분석을 수행합니다. 보시다시피, 93 %의 메모리는 Ajax가 쓸모없는 상태를 유지하고 있습니다. 그 쓸모없는 국가들을 강제로 풀어주고 싶습니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

나는 내가 한 경우는 손상되지 확실치 매우 이상한 형태의 imbrications가 그것을 저장할 수있는 뷰의 수를 제한에 대해 있지만 일부 페이지에서 생각했다. 사전에

감사합니다 ..

답변

0

좋아, 그래서 단지의 경우, 여기가 JSF의 메커니즘에 내재되어 있기 때문에 어떤 수정이 없음을 기본적으로 말하는 문제에 대한 relevant link이다. 뷰의 수에 매개 변수 단계를 사용하여 더 깨끗하게 보였습니다.

하지만 일부 더러운 고정을 실험. 나중에 참조 할 수 있도록 게시 중입니다. 보장이 없기 때문에 책임지고 사용하십시오.

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();를 호출하고 당신을 위해 메모리를 사용할 수있게됩니다. 그러나 잠재적 인 부작용을 조심하십시오, 이것은 실험 코드입니다

관련 문제