On 9/23/14 6:04 AM, ma...@apache.org wrote:
> Author: markt
> Date: Tue Sep 23 13:04:52 2014
> New Revision: 1626998
>
> URL: http://svn.apache.org/r1626998
> Log:
> Prevent potential memory leaks when the Pool is dereferenced without being 
> closed.
>
> Modified:
>     commons/proper/pool/trunk/src/changes/changes.xml
>     
> commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
>
> Modified: commons/proper/pool/trunk/src/changes/changes.xml
> URL: 
> http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/changes/changes.xml?rev=1626998&r1=1626997&r2=1626998&view=diff
> ==============================================================================
> --- commons/proper/pool/trunk/src/changes/changes.xml (original)
> +++ commons/proper/pool/trunk/src/changes/changes.xml Tue Sep 23 13:04:52 2014
> @@ -80,6 +80,10 @@ The <action> type attribute can be add,u
>      <action dev="ggregory" type="update" issue="POOL-274">
>        Update asm-util to 5.0.3 from 4.0.
>      </action>
> +    <action dev="markt" type="fix">

Fix what?  Should be a JIRA for this if it is a bug.

Phil
> +      Prevent potential memory leaks when the Pool is dereferenced without 
> being
> +      closed.
> +    </action>
>    </release>
>    <release version="2.2" date="2014-02-24" description=
>  "This is a maintenance release that adds a new testOnCreate configuration 
> option
>
> Modified: 
> commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
> URL: 
> http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java?rev=1626998&r1=1626997&r2=1626998&view=diff
> ==============================================================================
> --- 
> commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
>  (original)
> +++ 
> commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
>  Tue Sep 23 13:04:52 2014
> @@ -20,6 +20,7 @@ import java.io.PrintWriter;
>  import java.io.StringWriter;
>  import java.io.Writer;
>  import java.lang.management.ManagementFactory;
> +import java.lang.ref.WeakReference;
>  import java.util.Iterator;
>  import java.util.TimerTask;
>  import java.util.concurrent.atomic.AtomicLong;
> @@ -94,9 +95,10 @@ public abstract class BaseGenericObjectP
>      /*
>       * Class loader for evictor thread to use since in a J2EE or similar
>       * environment the context class loader for the evictor thread may have
> -     * visibility of the correct factory. See POOL-161.
> +     * visibility of the correct factory. See POOL-161. Uses a weak 
> reference to
> +     * avoid potential memory leaks if the Pool is discarded rather than 
> closed.
>       */
> -    private final ClassLoader factoryClassLoader;
> +    private final WeakReference<ClassLoader> factoryClassLoader;
>  
>  
>      // Monitoring (primarily JMX) attributes
> @@ -137,7 +139,8 @@ public abstract class BaseGenericObjectP
>          this.creationStackTrace = getStackTrace(new Exception());
>  
>          // save the current CCL to be used later by the evictor Thread
> -        factoryClassLoader = Thread.currentThread().getContextClassLoader();
> +        factoryClassLoader = new WeakReference<ClassLoader>(
> +                Thread.currentThread().getContextClassLoader());
>          fairness = config.getFairness();
>      }
>  
> @@ -251,7 +254,7 @@ public abstract class BaseGenericObjectP
>      public final boolean getLifo() {
>          return lifo;
>      }
> -    
> +
>      /**
>       * Returns whether or not the pool serves threads waiting to borrow 
> objects fairly.
>       * True means that waiting threads are served as if waiting in a FIFO 
> queue.
> @@ -997,8 +1000,14 @@ public abstract class BaseGenericObjectP
>                      Thread.currentThread().getContextClassLoader();
>              try {
>                  // Set the class loader for the factory
> -                Thread.currentThread().setContextClassLoader(
> -                        factoryClassLoader);
> +                ClassLoader cl = factoryClassLoader.get();
> +                if (cl == null) {
> +                    // The pool has been dereferenced and the class loader 
> GC'd.
> +                    // Cancel this timer so the pool can be GC'd as well.
> +                    cancel();
> +                    return;
> +                }
> +                Thread.currentThread().setContextClassLoader(cl);
>  
>                  // Evict from the pool
>                  try {
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to