Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Memory leak with ViewScoped bean?

In our JavaEE6 project (EJB3, JSF2) on JBoss 7.1.1, it seems we have a memory leak with SeamFaces @ViewScoped.

We made a little prototype to check the fact :

  • we use JMeter to call a page 200 times;
  • the page contains and calls a viewscoped bean which injects a stateful EJB;
  • we fix the session timeout at 1 minute.

At the end of the test, we check the content of the memory with VisualVM, and here what we got:

  • with a @ViewScoped bean, we still get 200 instances of the stateful MyController - and the @PreDestroy method is never called;
  • with a @ConversationScoped bean, @preDestroy method is called a the session end and then we got a clean memory.

Do we badly use the view scope, or is it truly a bug?


Here's the XHTML page:

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

Now the included bean myBean. For the @ConversationScoped variant, all commented parts are uncommented.

@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;
    }
}

And then the injected stateful bean MyController:

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

   @PreDestroy
   public void destroy()
   {
         System.out.println("Destroy");
   }
}
like image 799
Xavier Portebois Avatar asked Aug 29 '12 16:08

Xavier Portebois


People also ask

What could be the possible cause of memory leaks?

In general, a Java memory leak happens when an application unintentionally (due to logical errors in code) holds on to object references that are no longer required. These unintentional object references prevent the built-in Java garbage collection mechanism from freeing up the memory consumed by these objects.

What is memory leak and out of memory?

A memory leak in Java is when objects you aren't using cannot be garbage collected because you still have a reference to them somewhere. An OutOfMemoryError is thrown when there is no memory left to allocate new objects.


Video Answer


1 Answers

I see many developers are satisfied with @ViewAccessScoped in Myface CODI. Could you please give it a try and tell the feedback.

like image 125
Mehdi Avatar answered Oct 14 '22 19:10

Mehdi