Some quick options off the top of my head:

J2EE 1.4 requires J2SE 1.4, so we could create an LRU cache with LinkedHashMap
(override the removeEldestEntry method).

We could also implement a cache using reference objects.

Since ELEvaluator already has a constructor arg for bypassing the cache, we
could expose a way to configure its use. I think the only place one is
currently created is as a singleton within Evaluator. Obviously, this could
also be combined with a more memory-friendly cache.

Quoting Daryl Beattie <[EMAIL PROTECTED]>:

> Hi everyone,
> 
>       Following up on the memory leak; I have found that the
> "possible" memory leak in the ELEvaluator is indeed a real memory leak.
> Beyond profiling to find the bug, I have gone to the trouble of
> disabling the sCachedExpressionStrings cache in ELEvaluator, recompiling
> the standard taglib, deploying and re-testing with the cache-disabled
> jar. What I found is that indeed the leak did disappear, and after
> running under a load for 8 hours my app was using the same amount of
> memory as it had used in the first 20 minutes.
>       So it definitely is a leak.
>       What should be done about it? Is there a last-recently-used map
> that we could be using instead of just a regular HashMap? Should I stick
> with my cache-disabled jar?
>       I would like to know how you folks would like to handle the bug
> so that I can eventually get a new version of the standard taglib.
> Otherwise, I'll be stuck deploying my hacked jar and relying on my own
> hacked version of the taglib. Let me know if there's any way I can help
> to get this problem fixed; I'd be glad to volunteer some effort and even
> some profiling testing.
> 
> Sincerely,
> 
>       Daryl.
> 
> 
> -----Original Message-----
> From: Daryl Beattie [mailto:[EMAIL PROTECTED] 
> Sent: Friday, October 15, 2004 5:40 PM
> To: [EMAIL PROTECTED]
> Subject: Possible Memory Leak in ELEvaluator.java (standard v1.0.6)
> 
> 
> Hi everybody,
>  
>         I have a question about a possible memory leak in
> ELEvaluator.java. I have noticed when profiling that HashMap entries
> (containing Strings, etc.) are kept by the sCachedExpressionStrings
> static variable and never removed. Over the course of running an
> application for several hours that uses tags that have evaluations in
> them, this Map builds up in memory -- in fact I noticed that it was 343k
> for just one tag alone after I ran my app for 5 minutes. I have
> dynamically constructed expressions, and am concerned that each one is
> being cached even if that expression is never used again.
>         Would it be prudent to use some other kind of Collection to
> store these cached expressions (such as one that times out its entries
> after a certain amount of time)?
>         Also, I have toyed with the idea of adding functionality to
> permanently disable the cache, but since I do not know the expense of
> creating a new ELParser with the String expression, I do not know if
> this will cripple my system. I believe I have a normal percentage of
> re-used expressions across my tags.
>         I also find it interesting that there is functionality to bypass
> getting values from the cache, but there is not yet a way to disable its
> use. Even when bypassing the cache, the cache grows over time.
>         What do you think about this possible leak?
>  
> Sincerely,
>  
>         Daryl.

-- 
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech       <http://www.dotech.com/>

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

Reply via email to