That might be reasonable if you are running with
-Dorg.apache.tapestry.disable-caching=true

With caching disabled, Tapestry has to constantly create new enhanced
subclasses for every page and every component.

On 10/6/05, Paolo DonĂ  <[EMAIL PROTECTED]> wrote:
> Hi Guys,
> I'm experiencing the same OutOfMemoryError seloha pointed out.
> I have a simple application with Tap4/Spring/Hibernate, a page with 2
> PropertySelection components which submits to a hibernate query (via
> spring's HibernateTemplate) and shows a result page which uses a Table
> component. Every query loads kind about 30 records... so my app is not
> stressed as the seloha's.
> After 20 querys I get the OutOfMemoryError.
>
> I've tried to profile my app with YourKit. That's what I've done:
> 1) Launched my application (running on tomcat)
> 2) done a few back and forth navigations
> 3) took a 1st memory snapshot
> 4) done a few back and forth navigations
> 5) took a 2nd memory snapshot
>
> Then I've used the YourKit's compare snapshots feature and discovered that
> there are +600 new javassist.CtNewClass instances. They are contained in the
> 'classes' HashTable of the unique
> org.apache.hivemind.service.impl.HiveMindClassPool instance.
> HiveMindClassPool used 12MB on the 1st snapshot and raised to 30MB on the
> 2nd.
> I've been only navigating my 2 *already-loaded* pages so I don't understand
> why that object is growing so much.
> The HiveMindClassPool.classes HashTable had about 1500 entries at the 1st
> snapshot and about 3500 at the 2nd one.
>
> I'm not a profiler guru (neither a tapestry one) so maybe I'm missing
> something, but I'd like to help solving this problem.
> I gotta use this app in production systems too.. :-)
>
> Hope this can help,
> Paolo
>
> On 9/27/05, seloha . <[EMAIL PROTECTED]> wrote:
> >
> > I have added the code to remove objects from the hibernate session cache
> > (i.e. the use of evict() method). I have checked that it is run each time.
> > This has no affect, to prove it I ran some tests with and without this
> > code.
> > I was not convinced that it would have an affect since I am running two
> > production systems which have run for months without ever being stopped
> > with
> > very similar Spring / Hibernate configurations.
> >
> > I decided to run some fairly crude tests to see if the OutOfMemoryError's
> > were repeatable, these were as follows:
> >
> > 1) Run the same search (which produces the maximum set 5000 results) every
> > time not leaving the search page. The search returned 7 successful results
> > and returned an OutOfMemoryError on the 8 search.
> >
> > 2) Same search as 1) but left the search page after first successful
> > render
> > of results and then repeat each search again without leaving the search
> > page. The search returned 5 successful results and returned an
> > OutOfMemoryError on the 6 search.
> >
> > 3) Same search as 1) but left the search page after each successful render
> > of results and then repeat each search again when leaving the search page
> > always went to the same page. The search returned 3 successful results and
> > returned an OutOfMemoryError on the 4 search.
> >
> > The page which was moved to after the search page was the home page which
> > had no persistent objects fetched using Spring / Hibernate.
> >
> > The above is repeatable every time I do the same tests. Adding the evict
> > object code in spring / hibernate code has no affect.
> >
> > Is it fair to say that since the number of pages that can be successfully
> > rendered before an OutOfMemoryError exception occurs is reduced by
> > changing
> > pages the problem resides at the presentation (Tapestry) level.
> >
> > Any thoughts?
> >
> > Paul
> >
> >
> > Patrick Casey <[EMAIL PROTECTED]> wrote:
> >
> > That looks like it'd work, yep. Dunno if the Hibernate session is
> > the root of your bug, but A) it might be and B) that looks like it'll
> > clear
> > it out.
> >
> > --- Pat
> >
> > >-----Original Message-----
> > >From: seloha . [mailto:[EMAIL PROTECTED]
> > >Sent: Monday, September 26, 2005 1:15 PM
> > >To: tapestry-user@jakarta.apache.org
> > >Subject: RE: OutOfMemoryError Tapestry 4.0
> > >
> > >Pat,
> > >
> > >So in my case then since the Hibernate session is controlled by Spring
> > >after
> > >getting the large list I could subsequently call a method in my DAO which
> > >looks something like this:
> > >
> > >public void clearSessionObjects(List bigList) {
> > > Iterator bigListIt = bigList.iterator();
> > > while (bigListIt.hasNext()) {
> > > getHibernateTemplate().evict(bigListIt.next);
> > > }
> > >}
> > >
> > >And without such an eviction this could be what is causing the
> > >OutOfMemoryError.
> > >
> > >regards,
> > >
> > >Paul
> > >
> > >Patrick Casey <[EMAIL PROTECTED]>
> > >
> > > To clean out a hibernate session:
> > >
> > > s.clear();
> > >
> > > That will clean everything out of it. Be warned though that it
> > >clears *everything* out of it, not just the stuff you recently loaded. A
> > >safer way is to evict each object one at a time as you load it e.g.
> > >
> > > Sesison s = HibHelper.getSession();
> > > Query q = s.createQuery("from bigList");
> > > List l = q.list();
> > > For (int x=0; x< l.size(); x++)
> > > s.evict(l.get(x));
> > > >-----Original Message-----
> > > >From: seloha . [mailto:[EMAIL PROTECTED]
> > > >Sent: Monday, September 26, 2005 12:45 PM
> > > >To: tapestry-user@jakarta.apache.org
> > > >Subject: RE: OutOfMemoryError Tapestry 4.0
> > > >
> > > >Pat,
> > > >
> > > >1) Yes I am setting the object list to null.
> > > >
> > > >2) I have not put a log statement in the code to check it but I have
> > set
> > >a
> > > >break point in debug mode and each time the page was rendered the code
> > in
> > > >pageDetached(PageEvent event) was run.
> > > >
> > > >3) There is no other code which references the list object except the
> > > >rendering using the For component.
> > > >
> > > >4) Subsequent to adding the pageDetached(PageEvent event) I have not
> > run
> > > >it
> > > >on with the caching enabled. This I will do next.
> > > >
> > > >5) I am using hibernate for the persistent layer. I have always just
> > let
> > > >Spring look after the hibernate session using declarative transactions
> > >and
> > > >have never bypassed this mechanism. How do I evict go about evicting
> > the
> > > >objects after the transaction which picks them up. Can I just write a
> > > >piece
> > > >of code in my DAO which after picking the objects up then has something
> > > >like:
> > > >
> > > >getHibernateTemplate().evict(objects);
> > > >
> > > >As you can see I am fairly nieve about use of hibernate too.
> > > >
> > > >
> > > >Thanks,
> > > >
> > > >Paul
> > > >
> > > >
> > > >Patrick Casey <[EMAIL PROTECTED]> wrote:
> > > >
> > > > Well, it really smells to me like a leak, largely because 5,000
> > > >objects, while a pain in the posterior to scroll through, is mouse nuts
> > > >from
> > > >a memory use standpoint (say each object is 10k (a whopper of an
> > object),
> > > >we're only looking at 50 M of memory here. Most object though are at
> > >least
> > > >an order of magnitude smaller than that.
> > > >
> > > > Just to reinterate though:
> > > >
> > > > It loads once fine.
> > > > If you keep loading the page, eventually you get an EOM error,
> > > >right?
> > > >
> > > > Some other things to look at:
> > > >
> > > >1) Unless Howard changed things or I'm remembering wrong, initial-value
> > > >*does not* reset object to that state. Rather it's the value at page
> > > >creation, not the value that something gets set to when a page goes
> > into
> > > >or
> > > >out of the pool. So to null something out after render, you need to
> > > >explicitly set it to null in the detach code (as it appears you are
> > > >doing).
> > > >
> > > >2) Can you put a log statement or something similar in your page
> > detatch
> > > >listener to make sure it's being called? I don't know how many times I
> > >got
> > > >bit by adding PageBeginRender methods to Tap 3 forms without
> > remembering
> > > >to
> > > >add implements PageEventListener to the class.
> > > >
> > > >3) Are there any other object (statics, the visit object, some other
> > > >property on the page) which reference your object chain?
> > > >
> > > >4) Do you still get the EOM with tapestry's cache turned off? If so,
> > it's
> > > >not your tapestry code that's hanging onto a reference. If not, then
> > the
> > > >problem lies in not re-iniitalizing something properly before a page
> > goes
> > > >back into the pool.
> > > >
> > > >5) Are you using Hibernate as your persistence layer? If so, are you
> > > >evicting these objects out of the session and/or loading them in a temp
> > > >session which you are subsequently closing? Objects loaded in a
> > Hibernate
> > > >session have the lifespan of the session, regardless of whether or not
> > > >your
> > > >code holds a reference to them.
> > > >
> > > >
> > > >
> > > > >-----Original Message-----
> > > > >From: seloha . [mailto:[EMAIL PROTECTED]
> > > > >Sent: Monday, September 26, 2005 11:55 AM
> > > > >To: tapestry-user@jakarta.apache.org
> > > > >Subject: RE: OutOfMemoryError Tapestry 4.0
> > > > >
> > > > >Thanks Pat,
> > > > >
> > > > >One thing I was not doing which you pointed out was setting the list
> > to
> > > > >null
> > > > >in pageDetached(PageEvent event) so I added this and also included
> > > > >System.gc(). This unfortunately had no affect. The list uses abstract
> > > > >getter
> > > > >and setter and is initialized in the .page spec with
> > > > >initial-value="ognl:null".
> > > > >
> > > > >I have a number of selection models for PropertySelection components
> > > >which
> > > > >are initialized lazily which I am not resetting to null each time
> > (but
> > > > >there
> > > > >are only about 100 total items in these objects). Could these have
> > any
> > > > >affect.
> > > > >
> > > > >I am really poking around in the dark. Similar Spring and Hibernate
> > > > >mechanism that I wrote using Tapestry 3.0.3 is on a production system
> > >and
> > > > >has run with no problems for months. Admittedly I never go and
> > display
> > > > >5000
> > > > >objects at once though!
> > > > >
> > > > >I cannot see that I am inadvertently holding onto any objects in the
> > >code
> > > > >but you never know?
> > > > >
> > > > >Thanks again for your help,
> > > > >
> > > > >Paul
> > > > >
> > > > >
> > > > >Patrick Casey <[EMAIL PROTECTED]> wrote:
> > > > >
> > > > > It sounds like a memory leak, but it could just be a slow garbage
> > > > >collector as well. Try adding:
> > > > >
> > > > > System.gc() to the end of your transaction to guarantee the garbage
> > > > >collector runs after each page render. Then see if repeated page
> > >renders
> > > > >still blow out your memory. If they do, then I suspect that somehow
> > you
> > > > >(or
> > > > >tapestry, or spring) is hanging onto a reference to those object
> > after
> > > > >page
> > > > >completion.
> > > > >
> > > > > --- Pat
> > > > >
> > > > > PS You *are* resetting your page properties to null (and nulling out
> > > > >the list of 5000 items) on the page's post-render cleanup phase,
> > right?
> > > > >
> > > > > >-----Original Message-----
> > > > > >From: seloha . [mailto:[EMAIL PROTECTED]
> > > > > >Sent: Monday, September 26, 2005 3:11 AM
> > > > > >To: tapestry-user@jakarta.apache.org
> > > > > >Subject: OutOfMemoryError Tapestry 4.0
> > > > > >
> > > > > >I have a page which allows a user to search the database based on
> > > >various
> > > > > >criteria. I have restricted the number of returned items to 5000. I
> > > > > >display
> > > > > >the items in the same search page using the @For component with
> > > > > >volatile="ognl:true" . Repeated searches which return 5000 items
> > will
> > > > > >result
> > > > > >in an OutOfMemoryError exception. If I leave the page and then
> > return
> > > >or
> > > > > >stay on the page I will ultimately get an OutOfMemoryError
> > exception.
> > > > > >
> > > > > >I can view other pages after this exception but a repeat of trying
> > to
> > > > > >display 5000 items on this page will display an OutOfMemory
> > >exception.
> > > > > >
> > > > > >The only way to clear this problem is to restart the servlet
> > >container.
> > > > > >This
> > > > > >fails using either Jetty or Tomcat in both development and
> > production
> > > > > >environments (using different operating systems).
> > > > > >
> > > > > >All the variables displaying the list are explicitly declared in
> > the
> > > > >.page
> > > > > >specification and using initial-value set to null.
> > > > > >
> > > > > >I am using Tapestry 4.0 beta 8.
> > > > > >
> > > > > >The data is retrieved using Spring and Hibernate (no fancy
> > patterns,
> > > > > >standard Spring declarative transactions and using
> > > > >getHibernateTemplate())
> > > > > >and mapped to Tapestry using hivemodule.xml:
> > > > > >
> > > > > > <implementation service-
> > > > > >id="hivemind.lib.DefaultSpringBeanFactoryHolder">
> > > > > > <invoke-factory>
> > > > > > <construct autowire-services="false"
> > > > > >class="uk.co.cymbol.tair.tapestry.AppSpringBeanFactoryHolderImpl">
> > > > > > <event-listener service-id="hivemind.ShutdownCoordinator" />
> > > > > > <set-object property="context"
> > > > > >value="service:tapestry.globals.WebContext" />
> > > > > > </construct>
> > > > > > </invoke-factory>
> > > > > > </implementation>
> > > > > >
> > > > > >and injecting the appropriate Spring bean.
> > > > > >
> > > > > >I am completely confused as to how to tie down the problem and
> > >isolate
> > > > > >which
> > > > > >section of code is causing the problem.
> > > > > >
> > > > > >Any help would be much appreciated.
> > > > > >
> > > > > >Paul
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > >---------------------------------------------------------------------
> > > > > >To unsubscribe, e-mail:
> > [EMAIL PROTECTED]
> > > > > >For additional commands, e-mail: tapestry-user-
> > >[EMAIL PROTECTED]
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >---------------------------------------------------------------------
> > > > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > >For additional commands, e-mail:
> > [EMAIL PROTECTED]
> > > > >
> > > > >
> > > > >
> > > > >---------------------------------------------------------------------
> > > > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > >For additional commands, e-mail:
> > [EMAIL PROTECTED]
> > > >
> > > >
> > > >
> > > >
> > > >---------------------------------------------------------------------
> > > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > >For additional commands, e-mail:
> > > >
> > > >
> > > >
> > > >---------------------------------------------------------------------
> > > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > >For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> > >
> > >
> > >---------------------------------------------------------------------
> > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > >For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> > >
> > >---------------------------------------------------------------------
> > >To unsubscribe, e-mail: [EMAIL PROTECTED]
> > >For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>


--
Howard M. Lewis Ship
Independent J2EE / Open-Source Java Consultant
Creator, Jakarta Tapestry
Creator, Jakarta HiveMind

Professional Tapestry training, mentoring, support
and project work.  http://howardlewisship.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to