[JAVA] L'histoire de @ViewScoped dévore la mémoire

environnement

application Web

phénomène

L'application est morte dans OutOfMemory. Le bean de gestion de l'écran fermé est vivant et R.I.P.

Partie suspecte

Flux initial

Explication commune

Annotation Espace de nom Durée de vie
@RequestScoped javax.enterprise.context.RequestScoped Une requête HTTP/réponse
@ViewScoped javax.faces.view.ViewScoped Alors que les vues sont les mêmes
@SessionScoped javax.enterprise.context.SessionScoped Début-fin de session
@ApplicationScoped javax.enterprise.context.ApplcationScoped Pendant que l'application est en cours d'exécution
@Dependent javax.enterprise.context.Dependent Dépend de la portée de la destination injectée
@ConversationScoped javax.enterprise.context.ConversationScoped Vous pouvez spécifier le début et la fin de manière arbitraire
@FlowScoped javax.enterprise.context.FlowScoped Du début à la fin d'un flux prédéfini

Ma compréhension

Hmm. ** Il est pratique si @ ViewScoped est généré lorsque l'écran est ouvert et jeté lorsqu'il est fermé. ** ** Vous pouvez donner à @ SessionScoped les informations de l'utilisateur connecté et créer un écran professionnel avec @ ViewScoped.

Vous pouvez également spécifier le nombre de "vues" qu'une session contient dans "web.xml".

/web.xml
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>sever</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.numberOfLogicalViews</param-name>
        <param-value>20</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.numberOfViewsInSession</param-name>
        <param-value>20</param-value>
    </context-param>

Sachez s'il sera libéré si la limite supérieure est dépassée.

Quand j'ai fait quelque chose comme ça, le bean de gestion de @ ViewScoped, qui aurait dû être détruit, était très vivant et la mémoire était écrasée.

Réellement

Apparemment, le bean de gestion de @ ViewScoped ne sera pas publié à moins qu'il n'ait le modèle suivant.

Par conséquent, il survit dans le modèle suivant.

Solution

Utilisez OmniFaces @ViewScoped au lieu du standard @ ViewScoped. Utilisez simplement l'annotation @ ViewScoped de ʻOmniFaces et elle la publiera lorsque vous récupérerez l'événement ʻunload de votre navigateur. Il est conçu pour ne pas affecter autant que possible la dépendance par défaut, je me demande donc s'il peut être introduit simplement pour utiliser @ ViewScoped.

Épilogue

Je pensais carrément que View serait géré écran par écran, mais ce n'est pas une unité basée sur un écran, mais une unité basée sur une arborescence de composants, il est donc faux de s'attendre à ce qu'elle soit publiée lorsque l'écran est fermé.

C'est un comportement d'interruption qui n'est pas ignoré même si le nombre maximal de vues logiques est dépassé.

~~ Ne tenez pas la session pendant longtemps et ne la rendez pas énorme ~~

Les références

jsf-2 - Pourquoi les @ViewScoped Beans qui ont expiré ne sont pas détruits avant l'expiration de la session stack overflow : JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?

Recommended Posts

L'histoire de @ViewScoped dévore la mémoire
[Édition Java] Histoire de la sérialisation
L'histoire de la rencontre avec l'annotation personnalisée Spring
Examiner l'utilisation de la mémoire des éléments Java
L'histoire de la mise à jour du Docker Container de Sonar Qube
L'histoire de RxJava souffrant de NoSuchElementException
L'histoire de l'écriture de Java dans Emacs
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de l'apprentissage de Java dans la première programmation
Une histoire sur la compatibilité d'un Dockerfile existant avec le GPU
L'histoire de l'introduction de la communication Ajax à Ruby
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
L'histoire du réglage de l'application Android avec libGDX
L'histoire de l'ajout du dernier Node.js à DockerFile
L'histoire de l'initialisation de Money :: Currency pendant les tests
Jugement du calendrier
L'histoire d'une exception d'état illégale dans Jetty.
Le monde de Clara-Rules (4)
Examinez les limites du "mur de mémoire de 32 Go" dans Elasticsearch
Le monde de Clara-Rules (1)
Le monde de Clara-Rules (3)
Le monde de Clara-Rules (5)
L'idée du tri rapide
L'histoire de la création de Dr.Orchid avec LINE BOT
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
L'idée de jQuery
L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
20190803_Java & k8s sur Azure L'histoire d'aller au festival
Une histoire remplie des bases de Spring Boot (résolu)
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
[Apache Tomcat] L'histoire de l'utilisation d'Apache OpenWebBeans pour activer CDI
À propos de la gestion de Null
Surveillance Docker-expliquant les bases des bases-
À propos de la description de Docker-compose.yml
Le jeu d'instancier java.lang.Void
Histoire de toucher mailchimp-api v3
Valeur médiane de trois valeurs
L'illusion de l'orientation objet
L'histoire de ne pas connaître le comportement de String en passant par Java
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
L'histoire de toString () commençant par le passage d'un tableau à System.out.println
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
L'histoire de la création d'un jeu d'Othello de type communication avec Scala.
L'histoire de l'arrêt parce que le test des rails n'a pas pu être fait
L'histoire selon laquelle les performances de traitement d'ARM d'Open JDK étaient faibles