2008-12-10 6 views

Répondre

2

Vous pouvez définir explicitement un délai d'attente de session dans le descripteur de déploiement ou le faire par programmation (bien que vous ne souhaitiez probablement pas le faire dans une application JSF).

Finalement, c'est dans le contrôle du conteneur - le serveur gère quand libérer des ressources indépendamment des paramètres d'expiration logique.

Vous pouvez aider à diagnostiquer ce qui se passe à l'aide d'écouteurs. Par exemple, vous pourriez avoir votre classe de haricots implémenter HttpSessionBindingListener. Il sera notifié quand il est ajouté ou retiré d'une session. Vous pouvez également regarder tous les événements de session en utilisant un HttpSessionAttributeListener (JSF peut utiliser la session pour gérer l'état de la vue, alors attendez-vous à des entrées que vous n'avez pas définies vous-même). Le HttpSessionAttributeListener est défini dans le web.xml:

<listener> 
    <display-name>MyListener</display-name> 
    <listener-class> 
     somepackage.MySessionDiagnosticListenerImpl 
    </listener-class> 
</listener> 

Si vous êtes juste de quitter le serveur inactif, il peut juste être qu'il appuie d'autres demandes de session pour déclencher le nettoyage de la session a expiré et vous observez un détail d'implémentation. Ou vous pouvez perdre la mémoire parce que vous avez défini une référence à l'objet dans une classe non gérée.

2

Vous avez vraiment besoin d'utiliser un profileur pour savoir ce qui se passe dans la mémoire d'une application Java. Le profileur d'éclipse est plutôt bon.

S'il s'agit d'un bean de session, il ne doit pas être instancié pour chaque hit de la page dans la même session.

Vous devez également garder à l'esprit que le GC ne collectera pas les classes immédiatement. Et le GC ne dépend pas nécessairement du temps.

Questions connexes