The following issue has been updated:

    Updater: Guido Anzuoni (mailto:[EMAIL PROTECTED])
       Date: Mon, 4 Oct 2004 2:10 AM
    Comment:
First, my opinions are affected by my way of dealing with 
templates-context-transformation in servlet env.
>From my point of view, templates are in-memory representation of (xml) files that can 
>safely be used concurrently by 
different threads.
Contexts are the environment in which actualisations (i.e. transformation) of 
templates takes place.
In servlet env, context is strictly related to request.
This means that a context is never reused, because of this relation.
Using a ThreadLocal to hold the "actual" incarnation of a Tag causes an implicit 
dependency Context <-> Current Thread.
More, with this way of using contexts in mind, tag cleaning must be called at the 
beginning of each transformation.
Looking at the way ThreadLocal hold references, it can be seen that, in an environment 
where threads are resused, such a fine grain use of ThreadLocal instances leads to an 
uncontrollable memory usage 
which depends on nr. of alive thread (not necessairly "active") 
and nr. of tags. More, if it is considered the way XMLParser
works, there is no easy way to add TagScript caching leading to, I think, huge gc 
activities.
My architectural view of the classes should allow caching of parsed ScriptBlock that 
will avoid continuous xml source parsing.
For what concerns JellyContext API change, I think that it is not a big problem 
because the added methods are used by TagScript, while library implementors use Tag.
Anyway, a still better solution, in my opinion, could be the one that moves userData 
as a WeakHashMap into the TagScript with JellyContext as a key.
Anyway, an open issue with this approach, and the previous as well, is the behaviour
in case, for example, of a TagScript holding reference to the Tag via userData and the 
enclosing TagScript invoking run() with a child JellyContext.
In this situation the Tag instance can be found only traversing the contexts from
child to parent(s).
In jelly-nothreadlocal2.ZIP you will find an implementation of 
this approach.

Just my 2 cents.

    Changes:
             Attachment changed to jelly-nothreadlocal2.ZIP
    ---------------------------------------------------------------------
For a full history of the issue, see:

  http://issues.apache.org/jira/browse/JELLY-148?page=history

---------------------------------------------------------------------
View the issue:
  http://issues.apache.org/jira/browse/JELLY-148

Here is an overview of the issue:
---------------------------------------------------------------------
        Key: JELLY-148
    Summary: Huge memory leak resulting from the use of ThreadLocal
       Type: Bug

     Status: Unassigned
   Priority: Critical

    Project: jelly
 Components: 
             core / taglib.core
   Versions:
             1.0

   Assignee: 
   Reporter: Hans Gilde

    Created: Sat, 18 Sep 2004 9:34 PM
    Updated: Mon, 4 Oct 2004 2:10 AM

Description:
There is a huge memory leak that results from the TagScript's use of ThreadLocal.

ThreadLocal is usually used from a staic variable, while TagScript uses it from an 
instance variable. Although this looks legal to me, it causes a huge memory leak.


---------------------------------------------------------------------
JIRA INFORMATION:
This message is automatically generated by JIRA.

If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa

If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


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

Reply via email to