[JAVA] Die Geschichte von @ViewScoped, die Speicher verschlingt

Umgebung

Internetanwendung

Phänomen

Die Anwendung ist in OutOfMemory gestorben. Die Management Bean des geschlossenen Bildschirms ist aktiv und R.I.P.

Verdächtiger Teil

Anfangsfluss

Allgemeine Erklärung

Anmerkung Namensraum Lebenszeit
@RequestScoped javax.enterprise.context.RequestScoped Eine HTTP-Anfrage/Antwort
@ViewScoped javax.faces.view.ViewScoped Während die Ansichten gleich sind
@SessionScoped javax.enterprise.context.SessionScoped Sitzungsstart-Ende
@ApplicationScoped javax.enterprise.context.ApplcationScoped Während die Anwendung ausgeführt wird
@Dependent javax.enterprise.context.Dependent Hängt vom Umfang des injizierten Ziels ab
@ConversationScoped javax.enterprise.context.ConversationScoped Sie können Start und Ende beliebig festlegen
@FlowScoped javax.enterprise.context.FlowScoped Vom Anfang bis zum Ende eines vordefinierten Flusses

Mein Verständnis

Hmm. ** Es ist praktisch, wenn "@ ViewScoped" beim Öffnen des Bildschirms generiert und beim Schließen verworfen wird. ** ** ** Sie können "@ SessionScoped" die Informationen des angemeldeten Benutzers geben und mit "@ ViewScoped" einen Geschäftsbildschirm erstellen.

Sie können auch die Anzahl der "Ansichten" angeben, die eine Sitzung in "web.xml" enthält.

/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>

Wissen Sie, ob es freigegeben wird, wenn die Obergrenze überschritten wird.

Als ich so etwas tat, war die Management-Bean von "@ ViewScoped", die hätte zerstört werden sollen, sehr lebendig und die Erinnerung wurde zerstört.

Tatsächlich

Anscheinend wird die Management-Bean von "@ ViewScoped" nur freigegeben, wenn sie das folgende Muster aufweist.

Daher überlebt es im folgenden Muster.

Lösung

Verwenden Sie OmniFaces @ViewScoped anstelle des Standards "@ ViewScoped". Verwenden Sie einfach die Annotation "@ ViewScoped" von "OmniFaces" und sie wird freigegeben, wenn Sie das "Entladen" -Ereignis Ihres Browsers abrufen. Es ist so konzipiert, dass die Standardabhängigkeit nicht so stark wie möglich beeinflusst wird. Daher frage ich mich, ob es nur für die Verwendung von "@ ViewScoped" eingeführt werden kann.

Nachwort

Ich habe mich gefragt, ob View bildschirmweise verwaltet werden soll. Da es sich jedoch nicht um eine bildschirmbasierte Einheit, sondern um eine komponentenbaumbasierte Einheit handelt, ist es falsch zu erwarten, dass sie beim Schließen des Bildschirms freigegeben wird.

Es handelt sich um ein Trap-Verhalten, das auch dann nicht verworfen wird, wenn die maximale Anzahl logischer Ansichten überschritten wird.

~~ Halte die Sitzung nicht lange und mache sie nicht riesig ~~

Verweise

jsf-2 - Warum @ViewScoped Beans, die abgelaufen sind, erst nach Ablauf der Sitzung zerstört werden stack overflow : JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?

Recommended Posts

Die Geschichte von @ViewScoped, die Speicher verschlingt
[Java Edition] Geschichte der Serialisierung
Die Geschichte der Begegnung mit Spring Custom Annotation
Untersuchen Sie die Speichernutzung von Java-Elementen
Die Geschichte der Aktualisierung des Docker-Containers von Sonar Qube
Die Geschichte von RxJava, das unter NoSuchElementException leidet
Die Geschichte des Schreibens von Java in Emacs
Die Geschichte des einfachen String-Vergleichs in Java
Die Geschichte des Lernens von Java in der ersten Programmierung
Eine Geschichte darüber, wie eine vorhandene Docker-Datei mit der GPU kompatibel gemacht werden kann
Die Geschichte der Einführung der Ajax-Kommunikation in Ruby
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Die Geschichte der Optimierung der Android-App mit libGDX
Die Geschichte des Hinzufügens der neuesten Node.js zu DockerFile
Die Geschichte der Initialisierung von Money :: Currency während des Testens
Beurteilung des Kalenders
Die Geschichte einer illegalen staatlichen Ausnahme in Jetty.
Die Welt der Clara-Regeln (4)
Untersuchen Sie die Grenzen der "32 GB Speicherwand" in Elasticsearch
Die Welt der Clara-Regeln (1)
Die Welt der Clara-Regeln (3)
Die Welt der Clara-Regeln (5)
Die Idee der schnellen Sortierung
Die Geschichte, Dr. Orchid mit LINE BOT zu machen
Die Geschichte von dto, dao-like mit Java, SQLite
Die Idee von jQuery
Die Geschichte der Erhöhung von Spring Boot von 1.5 auf 2.1 Serie Teil2
20190803_Java & k8s on Azure Die Geschichte vom Festivalbesuch
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Die Geschichte des Werfens von BLOB-Daten von EXCEL in DBUnit
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
[Apache Tomcat] Die Geschichte der Verwendung von Apache OpenWebBeans zum Aktivieren von CDI
Über den Umgang mit Null
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
Informationen zur Beschreibung von Docker-compose.yml
Das Spiel der Instanziierung von java.lang.Void
Die Geschichte, wie man mailchimp-api v3 berührt
Medianwert von drei Werten
Die Illusion der Objektorientierung
Die Geschichte, das Verhalten von String durch Passieren von Java nicht zu kennen
Die Geschichte von Collectors.groupingBy, die ich für die Nachwelt behalten möchte
Die Geschichte von toString () beginnt mit der Übergabe eines Arrays an System.out.println
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
Die Geschichte eines Othello-Spiels vom Kommunikationstyp mit Scala.
Die Geschichte des Anhaltens, weil der Schienentest nicht durchgeführt werden konnte
Die Geschichte, dass die Verarbeitungsleistung von ARM von Open JDK niedrig war