db-ojb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ilkka Priha <impr...@surfeu.fi>
Subject Re: ThreadLocal causing memory leak
Date Thu, 09 Jun 2005 17:37:22 GMT
Thanks a lot Danilo, we've noticed this very same leak but thought it is a 
Tomcat problem and simply accepted that after 3-5 redeployments the server must 
be restarted! Your first patch seems to be OK for us as we don't apply proxies 
either.

-- Ilkka


Danilo Tommasina wrote:
> Hi again, and sorry for spamming the mailinglist :)
> 
> Here is some code that can be applied to org.apache.ojb.broker.core.PersistenceBrokerThreadMapping
to clean up the ThreadLocal stuff to be able to cleanly
> shutdown/reload a web-application without leaks in the PermGen. Using following code
will no longer needs the workaround suggested in my previous mail.
> 
> Add a new static field to the class:
>     private static java.util.ArrayList loadedHMs = new java.util.ArrayList();
> 
> Modifiy the following method
>     public static void setCurrentPersistenceBroker(PBKey key, PersistenceBroker broker)
>          throws PBFactoryException
>     {
>         HashMap map = (HashMap) currentBrokerMap.get();
>         WeakHashMap set = null;
>         if (map == null)
>         {
>             map = new HashMap();
>             currentBrokerMap.set(map);
> 
>             loadedHMs.add( map );  // ------------------ HERE IS IT
>         }
>         else
>         {
>             set = (WeakHashMap) map.get(key);
>         }
> 
>         if (set == null)
>         {
>             // We emulate weak HashSet using WeakHashMap
>             set = new WeakHashMap();
>             map.put(key, set);
>         }
>         set.put(broker, null);
>     }
> 
> Add this new method:
>     /** Clean up static fields and any registered ThreadLocal contents to cleanly shutdown/reload
OJB
>      * within web-applications
>      */
>     public static void shutdown()
>     {
>         for ( Iterator it = loadedWHM.iterator(); it.hasNext(); )
>         {
>             ((HashMap) it.next()).clear();
>         }
>         loadedHMs.clear();
>         loadedHMs = null;
>         currentBrokerMap = null;
>     }
> 
> The PersistenceBrokerThreadMapping.shutdown() method must be called in your 'web application
shutdown interceptor'.
> Since there are other routines in OJB that should be called when shutting down a web-application
it would be nice to have a central method for doing this.
> Further routines that should be called are:
> // Release all persistence broker instances
> - PersistenceBrokerFactory.releaseAllInstances();
> // Release all (pooled) db connections
> - ConnectionFactoryFactory.getInstance().createConnectionFactory().releaseAllResources();
> - And stop any eviction Thread that is still running in background (see my first post)
> 
> Please note that there are other ThreadLocal variables that are used in OJB depending
on the config. Maybe it is also necessary to clean-up these variables (I
> did not test it)
> - MetadataManager.threadedRepository
> - MetadataManager.currentProfileKey
> - JTATxManager.txRepository
> 
> Hopefully this can be of any help.
> bye
> danilo
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-user-help@db.apache.org
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org


Mime
View raw message