Paul Pogonyshev created MYFACES-4722:
----------------------------------------

             Summary: Memory leak when using unscoped managed beans
                 Key: MYFACES-4722
                 URL: https://issues.apache.org/jira/browse/MYFACES-4722
             Project: MyFaces Core
          Issue Type: Bug
          Components: General
    Affects Versions: 2.3.11
         Environment: Linux + WildFly
            Reporter: Paul Pogonyshev
         Attachments: myfaces-memory-leak.tar.gz

When a managed bean is instantiated by MyFaces, it gets registered in some 
deployment-global map. I'm not sure about the interface involved, on WildFly it 
boils down to `CachingWebInjectionContainer`. When the bean's scope (request, 
session, etc.) is closed, the bean is removed from this map. However, if the 
bean has no scope associated, it seems to never get removed, essentially 
leaking memory. If the bean is large or references lots of objects, this 
eventually leads to OOM situation. We have observed this in practice.

I created a simple reproducer project. I only tested with MyFaces 2.3 and 
WildFly 26, but the bug might also be present in newer versions as well (it is 
simply not easy for me to test as I used the same setup as for our real 
project).

To reproduce:
 * unpack the project;
 * build it (`./gradlew clean build`);
 * deploy on WildFly;
 * visit the page (sth. like 
`http://localhost:8080/myfaces-memory-leak/test.jsf`);
 * refresh about 10-20 times (depends on WildFly settings etc.);
 * eventually OOM is triggered.

You also don't have to wait for OOM. If you check server output (stdout) you 
can see text like this:

NEW MANAGED BEAN: request #0 
NEW MANAGED BEAN: unscoped #1 
NEW MANAGED BEAN: unscoped #2 
NEW MANAGED BEAN: request #3 
GARBAGE-COLLECTED: request #0 
NEW MANAGED BEAN: unscoped #4 
NEW MANAGED BEAN: unscoped #5 
NEW MANAGED BEAN: request #6 
GARBAGE-COLLECTED: request #3 
...

I.e. managed beans with request scope get allocated and then garbage-collected. 
However, beans without associated scope never get garbage-collected because 
they are still reachable in memory.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to