Speicherverlust mit ViewScoped Bean?

In unsererJavaEE6 Projekt (EJB3, JSF2) aufJBoss 7.1.1Anscheinend haben wir ein Speicherleck mit SeamFaces@ViewScoped.

Wir haben einen kleinen Prototyp gemacht, um die Tatsache zu überprüfen:

Wir verwenden JMeter, um eine Seite 200 Mal aufzurufen.Die Seite enthält und ruft ein Viewscoped-Bean auf, das einen Stateful-EJB injiziert.Wir korrigieren das Sitzungs-Timeout auf 1 Minute.

Am Ende des Tests überprüfen wir den Inhalt des Speichers mit VisualVM und hier, was wir haben:

mit einer@ViewScoped Bean, wir bekommen immer noch 200 Instanzen des StatefulMyController - und das@PreDestroy Methode wird nie aufgerufen;mit einer@ConversationScoped Bohne,@preDestroy Methode heißt das Ende der Sitzung und dann haben wir einen sauberen Speicher.

Verwenden wir den Ansichtsbereich schlecht oder handelt es sich wirklich um einen Fehler?

Hier ist die XHTML-Seite:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"   
   xmlns:s="http://jboss.org/seam/faces">
   <f:metadata>
        <f:viewParam name="u" value="#{myBean.uselessParam}" />
        <s:viewAction action="#{myBean.callService}" />
   </f:metadata>
   <h:body >
        <f:view>
        </f:view>
   </h:body>    
</html>

Nun die mitgelieferte BohnemyBean. Für die@ConversationScoped Variante sind alle kommentierten Teile unkommentiert.

@ViewScoped
// @ConversationScoped
@Named
public class MyBean implements Serializable 
{
    @Inject
    MyController myController;
    //@Inject
    //Conversation conversation;

    private String uselessParam;

    public void callService()
    {
        //if(conversation.isTransient())
        //{
        //            conversation.begin();
        //}
        myController.call();
    }

    public String getUselessParam() 
    {
        return uselessParam;
    }

    public void setUselessParam(String uselessParam) 
    {
        this.uselessParam = uselessParam;
    }
}

Und dann die eingespritzte Stateful BeanMyController:

@Stateful
@LocalBean
public class MyController
{
   public void call()
   {
         System.out.println("call ");
   }

   @PreDestroy
   public void destroy()
   {
         System.out.println("Destroy");
   }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage