2 Replies Latest reply on Oct 12, 2006 9:40 PM by gavin.king

    WebSessionContext.flush causing out of memory

      Hello,
      A change (from non impl to the current copy-all) in WebSessionContext.flush is causing out-of-memory experiance in my portlet environment (with the special naive PortletSessionImpl).
      With the flush below, 1000 Mb of memory consumed in 20 clicks in seam app, with the flush commented out no problem.
      This is likely caused by the PortletSessionImpl which simply sets everything both in APPLICATION and PORTLET scope.. Btw i used the Jhat (included with JDK6) too to track this one down, pretty neat tool, now that's included with the JDK6. http://weblogs.java.net/blog/jfarcand/archive/2006/02/using_mustangs.html

      The names of attributes were very very long:
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3_konseptimittaus_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      javax.portlet.p.tc3Portlet_kohteen_valinta_WAR_TrueConcept_LAYOUT_PRI.1005.6?
      org.jboss.seam.CONVERSATION#3$tc3EntityManager
      This might indicate that there're some pretty weird namespace related problems when running on Portlets.


      public void flush() {
       for ( String name: getNames() )
       {
       Object attribute = session.getAttribute(name);
       if ( attribute instanceof Mutable && ( (Mutable) attribute ).clearDirty() )
       {
       session.setAttribute(name, attribute);
       }
       }
      


      /*
       * JBoss, Home of Professional Open Source
       *
       * Distributable under LGPL license.
       * See terms of license at gnu.org.
       */
      package org.jboss.seam.portlet;
      
      import java.util.Collections;
      import java.util.Enumeration;
      import java.util.List;
      
      import javax.portlet.PortletSession;
      
      import org.apache.commons.collections.ListUtils;
      import org.jboss.seam.contexts.ContextAdaptor;
      
      /**
       * @author <a href="mailto:theute@jboss.org">Thomas Heute </a>
       * @version $Revision: 1.4 $
       */
      public class PortletSessionImpl extends ContextAdaptor {
      
       private PortletSession session;
      
       public PortletSessionImpl(PortletSession session) {
       this.session = session;
       }
      
       public Object getAttribute(String key) {
       // search for key first in PORTLET_SCOPE
       Object o = session.getAttribute(key);
       Object po = null;
       // if nothing is found there try APPLICATION_SCOPE
       if (o == null) {
       po = session.getAttribute(key, PortletSession.APPLICATION_SCOPE);
       return po;
       } else {
       // TODO: just do some cleaning up or maybe not
       // session.removeAttribute(key, PortletSession.APPLICATION_SCOPE);
       }
      
       return o;
       }
      
       public void removeAttribute(String key) {
       session.removeAttribute(key);
       session.removeAttribute(key, PortletSession.APPLICATION_SCOPE);
       }
      
       public Enumeration getAttributeNames() {
       Enumeration portletAttributeNamesEnum = session.getAttributeNames();
       Enumeration portalAttributeNamesEnum = session
       .getAttributeNames(PortletSession.APPLICATION_SCOPE);
      
       List portletAttributeNames = Collections
       .list(portletAttributeNamesEnum);
       List portalAttributeNames = Collections.list(portalAttributeNamesEnum);
      
       // TODO: Is this correct?
       List allNames = ListUtils.sum(portletAttributeNames,
       portalAttributeNames);
      
       return Collections.enumeration(allNames);
       }
      
       public void setAttribute(String key, Object value) {
       session.setAttribute(key, value);
       session.setAttribute(key, value, PortletSession.APPLICATION_SCOPE);
       }
      
       public void invalidate() {
       session.invalidate();
       }
      
      }
      
      


        • 1. Re: WebSessionContext.flush causing out of memory

           

          public String[] getNames()
           {
           Enumeration names = session.getAttributeNames();
           ArrayList<String> results = new ArrayList<String>();
           String prefix = ScopeType.CONVERSATION.getPrefix();
           while ( names.hasMoreElements() ) {
           String name = (String) names.nextElement();
           if ( !name.startsWith(prefix) )
           {
           results.add(name);
           //results.add( name.substring(prefix.length()) );
           }
           }
           return results.toArray(new String[]{});
           }
          


          if ( !name.startsWith(prefix) ) is sometimes misguided because the name can start with "javax.portlet" but still have the prefix somewhere else (see the very long string in previous post).

          • 2. Re: WebSessionContext.flush causing out of memory
            gavin.king

            yew! ok, please add a bug report to JIRA