Diese Frage ist spezifisch für die OmniFaces @ViewScoped bean (jedoch von Interesse für eine breitere Diskussion über Speicherverlust und Ressourcenentsorgung mit JSF @ViewScoped).JSF: Mojarra vs. OmniFaces @ViewScoped: @PreDestroy aufgerufen aber Bean kann nicht Müll gesammelt werden
https://github.com/webelcomau/JSFviewScopedNav
Dieser Test Web-App eine umfassende README mit vollständigen Anweisungen hat, sowie kommentierte Test web: Es ist auf GitHub auf den Ergebnissen dieser NetBeans8.1 Test Web-App basiert Seiten vergleichen veraltete JSF2.0-Stil @ManagedBean @ViewScoped
, JSF2.2-Stil CDI-freundlich @Named @ViewScoped
und OmniFaces @Named @ViewScoped
Bohnen.
Die Ergebnisse, die JVisualVM zur Diagnose verwenden, sind in einer herunterladbaren Tabelle zusammengefasst (siehe Abbildung unten) und zeigen an, dass die Bean OmniFaces-2.5.1 @ViewScoped
@PreDestroy-Methoden unter GET-basierten Navigationsfällen beim Verlassen einer Ansicht aufruft (die Möglichkeit zu geben, die meisten Ressourcen freizugeben), scheint es keine Speicherbereinigung der tatsächlichen Bean zu erlauben (zumindest nicht mit den aktuellen Kontextparametereinstellungen).
In web.xml wird die Anwendung verwenden gesetzt:
com.sun.faces.numberOfViewsInSession 4
com.sun.faces.numberOfLogicalViews 4
standardmäßig diese OmniFaces spezifische Parameter wird auf Kommentar:
org.omnifaces.VIEW_SCOPE_MANAGER_MAX_ACTIVE_VIEW_SCOPES
Die javax.faces.STATE_SAVING_METHOD standardmäßig auf ‚Server ".
Die wichtigste Frage ist:
Q1: Ist es richtig, dass diese OmniFaces @ViewScoped
Bohnen nicht durch Design Müll „live“ gesammelt werden (was bedeutet, sagen durch Provokation eines Profiler Müll collectiong Aktion verwenden, nicht warten bis eine Sitzung zu Ende ist)?
Q2: Wenn das so ist, wie kann (sollte) man am besten die Freigabe von ihnen beim Navigieren weg von Seiten (vor allem unter GET-Navigationen)?
Q3: Wenn nicht (wenn meine Ergebnisse aufgrund einer anderen Einstellung nicht korrekt sind), warum erlebe ich keine provozierte Garbage Collection von ihnen, und was kann ich tun, um sicherzustellen, dass sie tatsächlich automatisch veröffentlicht werden?
Da die Test-Web-App herunterladbar, gut dokumentiert und hoffentlich selbsterklärend ist, werde ich hier keinen Code geben, sondern einfach die bisherigen Vergleichsergebnisse sowie Screenshots der Test-App-Seiten in Aktion:
teilweise verwandte (nur, Duplikate NOT): Meine eigene allgemeinere Frage (nicht spezifisch für OmniFaces) [Wie erkennen und entfernen (während einer Sitzung) ungenutzt '@ViewScoped 'Bohnen, die nicht Müll gesammelt werden können] (http://stackoverflow.com/questions/30410601/how-detect-and-remove-during-a-session-unused-viewscoped-beans-that-cant-be). Und [Speicherimplikationen von OmniFaces ViewScoped Bean?] (Http://stackoverflow.com/questions/21236730/memory-implications-of-omnifaces-viewscoped-bean), aber scheint nicht zwischen '@ PreDestroy' und Garbage Collection zu unterscheiden . –