2013-03-07 16 views
13

Der Lebenszyklus des @RequestScoped und @SessionScopedBeanManaged Beans durch die Servlet-Container selbst verwaltet werden, da sie im Grunde als ein Attribut von HttpRequest und HttpSession jeweils gespeichert sind. Wie verwaltet JSF den Lebenszyklus der @ViewScopedBean? Ich weiß, dass es erstellt wird, wenn die Ansicht erstellt wird und verwendbar ist, bis ein Postback zu einer anderen Ansicht vorhanden ist. Aber ich habe herausgefunden, dass nicht sofort Müll gesammelt wird, nachdem wir uns von dieser Ansicht entfernt haben.Wie und wann wird eine @ViewScoped-Bean in JSF zerstört?

+0

Sobald eine verwaltete Bean-Aktionsmethode ein gültiges Ergebnis für den Navigationsvorgang zurückgibt, obwohl sie in derselben Sicht vorliegt, wird die View-Scope-verwaltete Bean übernommen und neu erstellt. Lesen Sie diese http://balusc.blogspot.co.il/2011/09/communication-in-jsf-20.html und hier sind sie gespeichert: http://Stackoverflow.com/a/9177769/617373 – Daniel

+0

Nun, in Wirklichkeit, du sollst nicht im Stande sein, gc vorherzusagen oder es sofort geschehen zu lassen, bist du? Aber bezüglich der viewscoped Bohnen in Mojarra, siehe http://stackoverflow.com/a/13097208/1530938 – kolossus

+0

Garbage Collection ist asynchron. Wenn der Ansichtsbereich "zerstört" ist, wird er tatsächlich wie alle anderen Java-Objekte als "Bereit zur Garbage Collection" markiert. Hinweis: Die Markierung ist wirklich eine Referenzzählung von 0 (d. H. Markiert mit "nicht mehr verwendet"). – DwB

Antwort

23

Es wird zerstört, wenn

  • ein Postback mit einem nicht null Ergebnis durchgeführt worden,

  • oder die Anzahl der (logischer) Ansichten in Session ist überschritten und die bestimmte Ansicht ist das erste in LRU-Kette (in Mojarra, das ist konfigurierbar durch com.sun.faces.numberOfViewsInSession und com.sun.faces.numberOfLogicalViews Kontextparameter, jeweils mit einem Standardwert von 15),

  • oder, die nu mber of active view scopes in der Sitzung hat überschritten (in Mojarra, das ist ein hardcoded Limit von 25), siehe auch JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?

  • oder, die Sitzung ist abgelaufen.

Es wird somit nicht zerstört werden, wenn die Seite als Ergebnis Anklicken eines GET-Link auf eine andere Seite oder die Seite aktualisieren oder Schließen des Browser-Tab/Fenster entladen wird. Die Bohne wird so lange leben, bis eine der oben genannten Bedingungen erfüllt ist. Um es während des Entladens trotzdem zu zerstören, sollten Sie stattdessen OmniFaces @ViewScoped verwenden.

+0

was meinst du mit LRU? Zuletzt verwendet? und was meinst du mit * logischen * Ansichten? – Geek

+2

1) Ja. Sie werden in einer LRU-Map gespeichert, sortiert nach der letzten Verwendung. Zuletzt wurde der 1. Eintrag verwendet. 2) Siehe http://stackoverflow.com/questions/12562469/how-can-i-set-the-view-timeout/12564632#12564632 – BalusC

+0

@BalusC, gibt es irgendwelche Lösungen zum destory viewscoped Bohnen schneller? wird omnafaces viewscoped annotation helfen? –