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]