You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Davanum Srinivas (JIRA)" <ax...@ws.apache.org> on 2005/04/29 14:57:27 UTC

[jira] Resolved: (AXIS-935) Using ThreadLocal Call objects in a servlet memory leak both on client and server side

     [ http://issues.apache.org/jira/browse/AXIS-935?page=all ]
     
Davanum Srinivas resolved AXIS-935:
-----------------------------------

    Resolution: Fixed

removed threadlocals

> Using ThreadLocal Call objects in a servlet memory leak both on client and server side
> --------------------------------------------------------------------------------------
>
>          Key: AXIS-935
>          URL: http://issues.apache.org/jira/browse/AXIS-935
>      Project: Axis
>         Type: Bug
>   Components: Basic Architecture
>     Versions: 1.1rc2
>  Environment: Operating System: All
> Platform: All
>     Reporter: Jennifer Jackson

>
> I discovered using Axis in tomcat causes a memory leak.
> It seems using threadlocal in the classes causes a memory leak for each Call 
> that is created.  Threadlocal sticks around until the calling thread dies, and 
> since tomcat keeps threads alive to answer new calls, the threadlocal data 
> never goes away.  The Call object gets stuck in the threadlocal data, which 
> contains the entire soap response and all objects.  This is a BIG memory leak.  
> I initially cleared it by forcing all Call objects to clean their member vars 
> after I was done with a call, then I realized the source was from the thread 
> local class.  Here is some info I found about threadlocal:
> This is stated in the Sun Javadocs for ThreadLocal:
> 	Each thread holds an implicit reference to its copy of a
> 	ThreadLocal as long as the thread is alive and the
> 	ThreadLocal object is accessible; after a thread goes
> 	away, all of its copies of ThreadLocal variables are
> 	subject to garbage collection (unless other references
> 	to these copies exist).
> So, this means that ANY APPLICATION that uses PreparedStatements in a thread
> that 1) either does a lot of PreparedStatements or 2) never dies (i.e., a
> main thread) will ALWAYS eventually have an out of memory error. Simply put,
> this is a MEMORY LEAK. I imagine that the leak is very small, the
> ThreadLocal object only contains one member variable, maybe 64 bytes or less
> (depending on the VM implementation). So, our 60,000 PreparedStatements of 2
> ThreadLocals each times 64 bytes (my wild guess) is 7.5MB.
> Ideas?  I've never used threadlocal myself so this is new to me.

-- 
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
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira