Pergunta

Running em um problema onde JSF está enchendo nossas sessões. Nós tínhamos um sistema falhar no outro dia. Enviou o Heap a IBM para revisão e descobriu que tivemos algumas sessões como grande como 50M. Eles descobriram componentes JSF na sessão e alguns muito grande.

Assim, há qualquer ajuste que pode ser feito? itens de configuração para olhar? Ou outra direção.

O nosso sistema é construído usando JSF e Primavera para a camada de apresentação, o back-end é EJB, Spring e Hibernate todos em execução no WebSphere 6.1.

Foi útil?

Solução

JSF é uma tecnologia útil, mas certamente você pode pendurar-se com ele.

Parece que, ou você está inflando o tamanho do estado de exibição (definindo valores grandes em componentes) ou você está vazando referências a componentes em outro estado da sessão (o que seria ruim). Outro culpado potencial seria um número excessivamente grande vista (eu vi a facilidade com que as pessoas possam construir árvores UI levar a muito grandes gráficos de controle com tabelas de dados em todos os lugares). Eu sei que a IBM fornece controles ricos de texto e planilhas -. Eu não posso comentar sobre o efeito que o uso destes terão em tamanho estado

A baixa fruta de suspensão é verificar os beans gerenciados configurados para escopo de sessão em faces-config.xml .

JSF salva duas coisas entre os pedidos:

  • o ponto de vista (todos os controles na página)
  • o estado de exibição (o estado dos controles)

Estes são separados porque alguns controles, como filhos de uma tabela de dados, pode ter vários estados (um para cada linha). Estado podem ser salvos em qualquer um campo oculto no formulário (que, se não criptografada, pode ser um grande risco de segurança) ou na sessão. A fim de acomodar várias janelas do navegador que compartilham a mesma sessão (e, em algumas implementações, apoio botão voltar), vários pontos de vista são armazenados.

  • Deve haver uma opção de configuração para definir o número de vista afirma o aplicativo irá manter na sessão para um determinado usuário em um determinado momento.
  • Você pode medir o tamanho do estado de exibição, fornecendo um StateManager que as medidas do tamanho da vista / estado salvo (configure um StateManager em faces-config.xml com um construtor público que leva um StateManager - veja a JSF especificação PDFs para mais detalhes, o estado é serializado e você pode verificar o seu tamanho, despejá-la a um stream) .

aplicativos JSF maioria IDE-construídos têm beans de apoio. Seria possível, por meio de sessão âmbito de feijão para agarrar estado mais tempo do que você quer, colocando uma pressão sobre a sessão. Uma vez que não tende a ser um bean de apoio por página, quanto mais páginas você tiver, maior o problema será. Verifique se o seu faces-config.xml para ver se esta é uma fonte potencial de problemas.

Outra coisa que você poderia fazer seria configurar um HttpSessionAttributeListener em sua web.xml . Você pode obter um pilha traço para ajudar a identificar áreas problemáticas em sua aplicação.

Outras dicas

Este é o segundo sistema Já ouvi falar de que tenha morrido por causa da JSF e criação do objeto excessiva. O outro também utilizado Primavera e de hibernação na extremidade traseira. Perfilar com Optimizeit mostrou que a resposta backend foi da ordem de milissegundos para todas as solicitações, mas você poderia vez que o navegador renderizar novamente com o cronômetro porque demorou tanto tempo - 30 segundos até vários minutos. Memória consumida pelo cliente era ridículo.

Eu era apenas um observador, não um membro desse equipe do projeto. Vou ter de perguntar se o problema já foi corrigido e, em caso afirmativo, qual é a solução poderia ter sido.

Mas se dois pontos tornar uma tendência, eu diria que JSF pode ser fatalmente falho. Pessoalmente, eu ficar longe dela por completo.

Por que não tentar um front-end web Primavera e ver se isso ajuda? Se você seguir o idioma Spring, que deveria ser uma questão relativamente simples de substituir JSF com JSPs baseados em JSTL e controladores de Primavera.

Eu estava trabalhando em um projeto JSF e descobriu que tinha um bug onde fomos adicionando vários JSF h: elementos de formulário. Resultando em uma cópia de todo o viewstate sendo incluído em cada formulário. Reduzir a 1 formulário para cada página raspada as páginas do ~ 2M até ~ 300K.

Você pode estar correndo em problemas com muitos backing feijão como escopo de sessão.

Você poderia tentar olhar para MyFaces Orchestra . Esta é uma biblioteca que fornece um escopo de conversação, então quando um usuário tiver terminado com um determinado conjunto de feijão eles serão removidos da sessão.

Eu entendo que a Primavera WebFlow tem características semelhantes, mas eu realmente não olhei para ele!

lojas JSF as vistas na sessão para apoiá-lo é componente rico arquitetura baseada (Necessidade de manter seu estado de exibição) e pode encher a pilha se não for usado corretamente. Se você não tem grande trabalho flui, sempre ir com pequena não de pontos de vista por sessão. Além disso, evite manter backingbeans em sessão, tanto quanto possível. Use tag personalizado para tornar o objeto de dados apenas para o próximo ciclo de pedido. Podemos também usar Spring Web Flow com JSF, que introduz ver escopo e fluxo âmbito se temos longos fluxos de trabalho no aplicativo para reduzir o nº de pontos de vista configurados em sessão. JSF pode ser usado para fazer rica interface de usuário fácil, que ajuda a construir webapplication semelhante ao aplicativo de desktop. Colocar uma pilha específica para JSF para fazer seu trabalho. Mas usar a memória de forma eficiente no lado do aplicativo e certifique-se de que não existem fugas de memória. Todos os vazamentos de memória precisam ser investigados e corrigidos durante o próprio desenvolvimento. Aways usar um profiler para encontrar vazamentos de memória e gargalos de desempenho que existe na aplicação.

Mat.

Se você estiver usando MyFaces <1.1.6 há um vazamento de memória enorme na forma como ele armazena antigas visões serializados na sessão efetivamente nunca mais deixá-los liberar para que eles possam ser lixo coletado. Eu tive um problema sério com isso e tinha sessões de 50MB também. Uma atualização rápida do MyFaces rectificado o problema sem quaisquer problemas.

Configurar sessão persistense ao banco de dados, e vai usar o algoritmo menos usado para empurrar sessões menos utilizadas sem memória. Ele tem alto desempenho (quando configurado corretamente) e irá ajudá-lo concretically e rápido.

Pouco de um tópico antigo, mas deparei com este recentemente. Muitas vezes, o e Vista para o Estado são armazenados (como mencionado anteriormente), e enche a sessão para permitir que o botão de voltar ao trabalho. Existem parâmetros para classificar esta em seus descritores de implementação (web.xml) que precisam ser definidas.

Várias instâncias de algumas bibliotecas pode precisar de mais do que um ajuste de parâmetros, como quando usando MyFaces e JSF RI. Por padrão, eles podem ser configurados para alguns valores muito altos (20 e 16 eu acredito, respectivamente). Isso significa que você pode estar usando 20 vezes o espaço que você deve ser para (de partes?) A sessão.

JSF dicas de ajuste para ambiente de produção:
- O uso de imagens, CSS e recursos de JavaScript deve ser feito por tags HTML padrão (img,link,script) não do lado do servidor, e certifique-se de conjunto #{request.contextPath} antes do url para evitar problemas de caminhos relativos
. - Cache seções estáticas do (menu,header,footer) página usando omnifaces cache
- Definir variável refresh-period para -1
- conjunto project-stage à Produção
- Rever os seus filtros de código se houver

Além disso, verifique o meu artigo " Java Server Faces no Real- Aplicações vida " na DZone, ele vai te dar uma imagem completa sobre JSF em ambientes de desenvolvimento, teste e produção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top