[ 
https://issues.apache.org/jira/browse/MYFACES-1658?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Bruno Aranda resolved MYFACES-1658.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 1.2.0-SNAPSHOT
                    1.1.6-SNAPSHOT
         Assignee: Bruno Aranda

Resolved with the solution proposed by Thomas in this post:

http://www.nabble.com/Possible-memory-leak-in-JspStateManagerImpl-t3863826.html

Many thanks Andre for spotting and reporting the problem with detailed 
explanation and proposing a solution!

> Memory leak in JspStateManagerImpl
> ----------------------------------
>
>                 Key: MYFACES-1658
>                 URL: https://issues.apache.org/jira/browse/MYFACES-1658
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 1.1.5
>         Environment: JDK1.5, using Tomcat 5.5.
>            Reporter: André Næss
>            Assignee: Bruno Aranda
>             Fix For:  1.1.6-SNAPSHOT, 1.2.0-SNAPSHOT
>
>
> We are working on a JSF project and recently started stress testing the 
> system. This stress-testing caused the JVM to run out of memory and spend 
> most of it time  doing Full GC. Analyzing the heap revealed that most of the 
> memory was being retained by SerializedViewCollection instances. We also 
> noticed that the value of NUMBER_OF_VIEWS_IN_SESSION didn't seem to affect 
> the memory usage.
> It seems the problem is due to the _oldSerializedViews hashmap which is 
> supposed to use soft references and hence be GC-ed whenever there is a lack 
> of memory, but this apparently doesn't work. Removing this hashmap completely 
> solved the problem. It is however difficult to provide a simple testcase as 
> we used JMeter to load the server with 600 users fetching a fairly big JSF 
> page with a constant throughput of 20 requests per second.
> I should also mention that we found this problem with 1.1.4 but I fixed it 
> with the 1.1.5 release.
> Here's the diff output:
> ~/code/myfaces-1.1.5/impl/src/main/java/org/apache/myfaces/application/jsp$ 
> svn diff
> Index: JspStateManagerImpl.java
> ===================================================================
> --- JspStateManagerImpl.java    (revision 543859)
> +++ JspStateManagerImpl.java    (working copy)
> @@ -18,7 +18,6 @@
>   */
>  package org.apache.myfaces.application.jsp;
> -import org.apache.commons.collections.map.ReferenceMap;
>  import org.apache.commons.lang.builder.EqualsBuilder;
>  import org.apache.commons.lang.builder.HashCodeBuilder;
>  import org.apache.commons.logging.Log;
> @@ -609,10 +608,6 @@
>          private final List _keys = new 
> ArrayList(DEFAULT_NUMBER_OF_VIEWS_IN_SESSION);
>          private final Map _serializedViews = new HashMap();
> -        // old views will be hold as soft references which will be removed by
> -        // the garbage collector if free memory is low
> -        private transient Map _oldSerializedViews = null;
> -
>          public synchronized void add(FacesContext context, Object state) {
>              Object key = new SerializedViewKey(context);
>              _serializedViews.put(key, state);
> @@ -623,10 +618,7 @@
>              int views = getNumberOfViewsInSession(context);
>              while (_keys.size() > views) {
>                  key = _keys.remove(0);
> -                Object oldView = _serializedViews.remove(key);
> -                if (oldView != null) {
> -                    getOldSerializedViewsMap().put(key, oldView);
> -                }
> +                _serializedViews.remove(key);
>              }
>          }
> @@ -660,23 +652,9 @@
>              return views;
>          }
> -        /**
> -         * @return old serialized views map
> -         */
> -        protected Map getOldSerializedViewsMap() {
> -            if (_oldSerializedViews == null) {
> -                _oldSerializedViews = new ReferenceMap();
> -            }
> -            return _oldSerializedViews;
> -        }
> -
>          public Object get(Integer sequence, String viewId) {
>              Object key = new SerializedViewKey(viewId, sequence);
> -            Object value = _serializedViews.get(key);
> -            if (value == null) {
> -                value = getOldSerializedViewsMap().get(key);
> -            }
> -            return value;
> +            return _serializedViews.get(key);
>          }
>      }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to