Hmmm...well,  I don't think I like the sound of any of that.  I'm just
going to pretend this problem doesn't exist.   (just kidding)

I had thought I was doing something special with the ognl compilations
that would cause its generated classes to not hang around afterwards
in any pools.

I'll take a look at things this weekend and am sure a fix will appear
in between now and Monday - if there is a reasonable fix to be found.
(in 4.1.3 snapshot form)

On 8/24/07, Bryan Dotzour <[EMAIL PROTECTED]> wrote:
> I and another colleague of mine have been investigating what seems to be
> a "memory leak" in our Tapestry application for about a month since we
> upgraded to T4.1.2.  I won't bore you with the saga of the last month,
> but I would like to present the data I've gathered and look to the list
> for a proposed solution.  I was reading a recent thread in which Jesse
> said (08/09/2007):
>
>
>
> "There is a map that grows as large as the system using it internally to
> javassist of various cached reflection info - but it doesn't leak in any
> way."
>
> This is precisely what I've found in profiling our application and it
> *appears* to be this map that is causing our applications to eventually
> run out of memory.
>
> The YourKit profiler shows me that, as time goes on, there is an
> instance of HiveMindClassPool  that grows and grows as class instances
> are created.  This class extends from javassist.ClassPool and is the map
> that Jesse is talking about in his quote above.  And he's right, I
> wouldn't say that the class pool "leaks" either because it looks like
> it's designed to retain that memory until the class pool itself is no
> longer needed.
>
>
>
> Take this quote from the javassist.ClassPool javadocs:
>
> "Memory consumption memo:
> ClassPool objects hold all the CtClasses that have been created so that
> the consistency among modified classes can be guaranteed. Thus if a
> large number of CtClasses are processed, the ClassPool will consume a
> huge amount of memory. To avoid this, a ClassPool object should be
> recreated, for example, every hundred classes processed. Note that
> getDefault() is a singleton factory. Otherwise, detach() in CtClass
> should be used to avoid huge memory consumption. "
>
> This huge memory consumption by the ClassPool is what I was seeing. In
> particular it is the ClassPool that is held onto by OgnlRuntime.
> Inspecting this object in the profiler showed that it has a map
> containing about 45,000 classes.  All of the keys into this map were
> things like:  "ASTTest_11494aca9af" and "ASTAnd_11494ace4fb" and the
> values are instances of javassist.CtNewClass.  Each entry in this map
> looks like it retains about 1,900 bytes, for a grand total of about 90
> MB of memory used.
>
> These numbers came from my staging deployment where I had the profiler
> attached, using some reflection tricks I was able to look at a
> production site and found that it had about 240,000 items in that class
> pool.. approximately 450 MB of memory.
>
> So I guess the questions in my mind are:  Why are there so many classes
> in the pool?  Why does the number only ever go up?  Do those classes
> really need to stay in the pool forever?
>
>
>
>
>
>


-- 
Jesse Kuhnert
Tapestry/Dojo team member/developer

Open source based consulting work centered around
dojo/tapestry/tacos/hivemind. http://blog.opencomponentry.com

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

Reply via email to