2012-10-26 11 views
7

W naszym projekcie JavaEE6 (EJB3, JSF2) na JBoss 7.1.1, wydaje się, że mamy wyciek pamięci z fasolą @ViewScoped. Ostatnie dni spędziłem na badaniu tego problemu. Stworzyłem więc prosty projekt z dwiema stronami, aby zagwarantować, że po opuszczeniu pierwszej strony opuszczającej komponent @ViewScoped.Połączone ViewScoped Beane prowadzą do wycieków pamięci

<context-param> //web.xml 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
</context-param> 

TreeBean.java

@ManagedBean 
@ViewScoped 
public class TreeBean implements Serializable { 
private TreeNode root; 
public static AtomicInteger count = new AtomicInteger(0); 

@Override 
protected void finalize() throws Throwable { 
    System.out.println("TreeBean beans count: " + count.decrementAndGet() + " (FINALISATION)"); 
} 


public TreeBean() { 
    super(); 
    System.out.println("TreeBean beans count: " + count.incrementAndGet() + " (INITIALISATION)"); 
} 

first.xhtml

.... 
    <h:form id="frm"> 
     <p:tree 
      value="#{treeBean.root}" 
      var="node" 
      id="tree"> 
    .... 
    <p:commandLink 
      action="second.xhtml?faces-redirect=true" 
      value="toSecond" /> 
    ....    

second.xhtml

.... 
    <h:form id="frm"> 
    .... 
    <p:commandLink 
      action="first.xhtml?faces-redirect=true" 
      value="toFirst" /> 
    .... 

sysout:

INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 1 (INITIALISATION) 
    INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 2 (INITIALISATION) 
    INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 3 (INITIALISATION) 
    ...... 
    INFO [stdout] (Finalizer) TreeBean beans count: 2 (FINALISATION) 
    INFO [stdout] (Finalizer) TreeBean beans count: 1 (FINALISATION) 
    INFO [stdout] (Finalizer) TreeBean beans count: 0 (FINALISATION) 

i wszystkie myśli przyszedł dobrze aż Dodałem zależność do innego @ViewScoped fasoli

TreeBean.java

@ManagedBean 
@ViewScoped 
public class TreeBean implements Serializable { 
private TreeNode root; 

@ManagedProperty(value = "#{treeNodeBean}") 
private TreeNodeBean treeNodeBean; 


public static AtomicInteger count = new AtomicInteger(0); 

@Override 
protected void finalize() throws Throwable { 
    System.out.println("TreeBean beans count: " + count.decrementAndGet() + " (FINALISATION)"); 
} 


public TreeBean() { 
    super(); 
    System.out.println("TreeBean beans count: " + count.incrementAndGet() + " (INITIALISATION)"); 
} 

TreeNodeBean.java

@ManagedBean 
@ViewScoped 
public class TreeNodeBean implements Serializable { 

    private String treeNodeItem="TreeNodeItem"; 

} 

A potem nikt bean został wydany. Czy ktoś wie, jak sobie z tym poradzić? Czy to błąd lub może być gdzieś skonfigurowany?

+0

Zobacz ten link. Obejście wykonane dla JSf 2.1 i 2.2 http://stackoverflow.com/questions/12182844/memory-leak-with-viewscoped-bean –

Odpowiedz

5

Niestety, masz rację, Znane są problemy z zarządzaniem pamięcią @ViewScoped (i nie dotyczy to tylko łączenia widoków), jak zobaczysz here i here. Zobacz także: this question Możesz poeksperymentować z obiektami UIViewRoot dla bieżącej sesji i zadzwonić pod numer getViewMap().remove("myView") na podstawie jakiegoś wydarzenia. Możesz także wypróbować: this

Niezwiązane z tym, dlaczego używasz widoku zmagazynowanego widoku? Są przeznaczone do wykorzystania jako nazwane, do widoków. Czy jesteś zmuszony do korzystania z SessionScoped?

+0

I choć vievscoped jest przeznaczony do krótszych okresów aktywności użytkownika. Więc ziarno jest żywe, dopóki nie opuścisz bieżącej strony. Sesje trwają dłużej, dopóki sesja internetowa nie spadnie. Więc moim wyborem była oszczędność pamięci. – bohdanius

+1

@bohanius, Zakładam, że i tak masz już w swojej aplikacji internetowej o zasięgu ustalonym w sesjach, a jeśli to zrobisz, to wszystko, co przechowujesz w zakresie widoku, które musisz odnieść do trzech oddzielnych widoków, powinno tam pozostać. Możesz wtedy zająć się czyszczeniem (ustawiając vary na wartość null lub inną) lub niszcząc je razem z sesją. Jeśli nie utworzono komponentu bean sesji, jest to bardzo ważne. Inną alternatywą jest zasięg błysku, który ma zastosowanie głównie wtedy, gdy trzy widoki są sekwencyjne – kolossus

Powiązane problemy