Hi Andre,

this parameter defines how many views are stored in memory - and
therefore enable back-button usage with server-side state saving
enabled. Try to set this option to 0, and then try to use the
back-button with server-side state saving - it won't work.

A symptom: you will have to click twice on any link or button after
you have hit the back-button once.

For client-side state-saving, the back button works out of the box.

regards,

Martin

On 6/8/07, Thomas Spiegl <[EMAIL PROTECTED]> wrote:
Thanks for reporting this André. Just opend a new issue:
https://issues.apache.org/jira/browse/MYFACES-1660

Thomas

On 6/7/07, André Næss <[EMAIL PROTECTED]> wrote:
> Yes, this helps. The OldGen no longer maxes out, and the memory behavior
> is the same as when I've removed the _oldSerializedView collection
> completely, so this was a simpler solution.
>
> But I must say this is a peculiar parameter. From what I gather, it
> defines an upper limit on the number of times the user can hit "Back".
> Except that with the implementation used here, the user might be able to
> go further, if the necessary state happens to be in memory. For our
> case, we only have a very few places where there is any use for this
> functionality, but if we crank up this parameter to something like 7, we
> greatly reduce the number of concurrent users we can support due to
> memory restrictions, and for a vast majority of these users, this
> parameter will not have any effect whatsoever, as the majority of
> requests go against simple read-only views.
>
> André Næss
>
>
>
> Thomas Spiegl wrote:
> > interesting. Actually it's using a soft reference. What if you substitute
> >
> > _oldSerializedViews = new ReferenceMap();
> > by
> > _oldSerializedViews = new ReferenceMap(AbstractReferenceMap.WEAK,
> > AbstractReferenceMap.WEAK, true);
> > ?
> > I'm curious if the behaviour is still the same.
> >
> > Thomas
> >
> >
> > On 6/4/07, André Næss <[EMAIL PROTECTED]> wrote:
> >> Hi
> >>
> >> 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.
> >>
> >> I then decided to have a look at the code, and found something very
> >> interesting at line 614 in JspStateManagerImpl. When views are taken out
> >> of the main collection they are stuffed into the _oldSerializedViews
> >> collection which is supposed to be a weak hashmap. The idea here, I
> >> suppose, is to use this as a kind of cache which trades some extra
> >> memory for performance, but only if the memory is available.
> >> Unfortunately it doesn't seem like this works as the author expected
> >> when he wrote this:
> >>
> >>         // old views will be hold as soft references which will be
> >> removed by
> >>         // the garbage collector if free memory is low
> >>
> >> The problem we saw when profiling was the the OldGen would grow and grow
> >> and reach a plateau, at which point the GC wasn't able to clean anything
> >> out if it. I removed the usage of the _oldSerializedViews and this
> >> immediately improved the situation. When the OldGen maxes out, a full GC
> >> is executed which reclaims most of the data. I've successfully tested
> >> this using JMeter, with up to 2000 threads running at a constant load of
> >> 30 requests per second, and it seems fine.
> >>
> >> Unless the _oldSerializedViews object can be made to work properly, I
> >> think it should be removed. After all, the developers can control the
> >> memory in a more predictable manner using the NUMBER_OF_VIEWS_IN_SESSION
> >> parameter. However, it is not entirely clear to me what the purpose of
> >> storing the views in the SerializedViewsCollections really is? Is it
> >> purely a performance trick (providing better rendering times), or does
> >> it provide some other kind of advantage to the end user?
> >>
> >> André Næss
> >>
> >>
> >>
> >> Here's the svn 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)
> >> @@ -41,6 +41,7 @@
> >>  import javax.faces.render.ResponseStateManager;
> >>  import java.io.*;
> >>  import java.util.*;
> >> +import java.util.logging.Logger;
> >>  import java.util.zip.GZIPInputStream;
> >>  import java.util.zip.GZIPOutputStream;
> >>
> >> @@ -611,7 +612,7 @@
> >>
> >>          // 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;
> >> +//        private transient Map _oldSerializedViews = null;
> >>
> >>          public synchronized void add(FacesContext context, Object
> >> state) {
> >>              Object key = new SerializedViewKey(context);
> >> @@ -623,10 +624,10 @@
> >>              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);
> >> +//                if (oldView != null) {
> >> +//                    getOldSerializedViewsMap().put(key, oldView);
> >> +//                }
> >>              }
> >>          }
> >>
> >> @@ -663,19 +664,19 @@
> >>          /**
> >>           * @return old serialized views map
> >>           */
> >> -        protected Map getOldSerializedViewsMap() {
> >> -            if (_oldSerializedViews == null) {
> >> -                _oldSerializedViews = new ReferenceMap();
> >> -            }
> >> -            return _oldSerializedViews;
> >> -        }
> >> +//        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);
> >> -            }
> >> +//            if (value == null) {
> >> +//                value = getOldSerializedViewsMap().get(key);
> >> +//            }
> >>              return value;
> >>          }
> >>      }
> >>
> >>
> >
> >
>
>


--
http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces



--

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Reply via email to