You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2012/04/29 22:01:09 UTC

svn commit: r1331984 - in /commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl: BaseGenericObjectPool.java GenericKeyedObjectPool.java GenericObjectPool.java

Author: markt
Date: Sun Apr 29 20:01:09 2012
New Revision: 1331984

URL: http://svn.apache.org/viewvc?rev=1331984&view=rev
Log:
Pull up maxTotal, blockWhenExhausted and the Evictor inner class.
Still lots more to pull up.

Modified:
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java

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=1331984&r1=1331983&r2=1331984&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 Sun Apr 29 20:01:09 2012
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Deque;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.TimerTask;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.management.ListenerNotFoundException;
@@ -44,32 +45,43 @@ public abstract class BaseGenericObjectP
     // Constants
     /**
      * Name of the JMX notification broadcast when the pool implementation
-     * swallows an {@link Exception}. 
+     * swallows an {@link Exception}.
      */
     public static final String NOTIFICATION_SWALLOWED_EXCEPTION =
             "SWALLOWED_EXCEPTION";
     private static final int SWALLOWED_EXCEPTION_QUEUE_SIZE = 10;
-    
+
     // Configuration attributes
-    // None as yet
-    
-    // Internal state attributes
+    private int maxTotal = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL;
+    private volatile boolean blockWhenExhausted =
+        GenericObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
+
+
+    // Internal (primarily state) attributes
     volatile boolean closed = false;
-    
+
+    /**
+     * 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.
+     */
+    private final ClassLoader factoryClassLoader;
+
+
     // Monitoring (primarily JMX) attributes
     private final NotificationBroadcasterSupport jmxNotificationSupport;
     private final String creationStackTrace;
     private final Deque<String> swallowedExceptions = new LinkedList<String>();
     private final AtomicInteger swallowedExcpetionCount = new AtomicInteger(0);
 
-    
+
     public BaseGenericObjectPool(BaseObjectPoolConfig config) {
         if (config.getJmxEnabled()) {
             this.jmxNotificationSupport = new NotificationBroadcasterSupport();
         } else {
             this.jmxNotificationSupport = null;
         }
-        
+
         // Populate the swallowed exceptions queue
         for (int i = 0; i < SWALLOWED_EXCEPTION_QUEUE_SIZE; i++) {
             swallowedExceptions.add(null);
@@ -77,9 +89,69 @@ public abstract class BaseGenericObjectP
 
         // Populate the creation stack trace
         this.creationStackTrace = getStackTrace(new Exception());
+
+        // save the current CCL to be used later by the evictor Thread
+        factoryClassLoader = Thread.currentThread().getContextClassLoader();
+    }
+
+
+    /**
+     * Returns the maximum number of objects that can be allocated by the pool
+     * (checked out to clients, or idle awaiting checkout) at a given time. When
+     * non-positive, there is no limit to the number of objects that can be
+     * managed by the pool at one time.
+     *
+     * @return the cap on the total number of object instances managed by the
+     *         pool.
+     * @see #setMaxTotal
+     */
+    public int getMaxTotal() {
+        return maxTotal;
+    }
+
+    /**
+     * Sets the cap on the number of objects that can be allocated by the pool
+     * (checked out to clients, or idle awaiting checkout) at a given time. Use
+     * a negative value for no limit.
+     *
+     * @param maxTotal  The cap on the total number of object instances managed
+     *                  by the pool. Negative values mean that there is no limit
+     *                  to the number of objects allocated by the pool.
+     * @see #getMaxTotal
+     */
+    public void setMaxTotal(int maxTotal) {
+        this.maxTotal = maxTotal;
+    }
+
+    /**
+     * Returns whether to block when the <code>borrowObject()</code> method is
+     * invoked when the pool is exhausted (the maximum number of "active"
+     * objects has been reached).
+     *
+     * @return <code>true</code> if <code>borrowObject()</code> should block
+     *         when the pool is exhausted
+     * @see #setBlockWhenExhausted
+     */
+    public boolean getBlockWhenExhausted() {
+        return blockWhenExhausted;
     }
 
     /**
+     * Sets whether to block when the <code>borrowObject()</code> method is
+     * invoked when the pool is exhausted (the maximum number of "active"
+     * objects has been reached).
+     *
+     * @param blockWhenExhausted    <code>true</code> if
+     *                              <code>borrowObject()</code> should block
+     *                              when the pool is exhausted
+     * @see #getBlockWhenExhausted
+     */
+    public void setBlockWhenExhausted(boolean blockWhenExhausted) {
+        this.blockWhenExhausted = blockWhenExhausted;
+    }
+
+
+    /**
      * Closes the pool destroys the remaining idle objects and, if registered in
      * JMX, deregisters it.
      */
@@ -92,12 +164,23 @@ public abstract class BaseGenericObjectP
     public final boolean isClosed() {
         return closed;
     }
-    
-    
+
+    /**
+     * <p>Perform <code>numTests</code> idle object eviction tests, evicting
+     * examined objects that meet the criteria for eviction. If
+     * <code>testWhileIdle</code> is true, examined objects are validated
+     * when visited (and removed if invalid); otherwise only objects that
+     * have been idle for more than <code>minEvicableIdleTimeMillis</code>
+     * are removed.</p>
+     *
+     * @throws Exception when there is a problem evicting idle objects.
+     */
+    public abstract void evict() throws Exception;
+
     /**
      * Throws an <code>IllegalStateException</code> if called when the pool has
      * been closed.
-     * 
+     *
      * @throws IllegalStateException if this pool has been closed.
      * @see #isClosed()
      */
@@ -107,22 +190,24 @@ public abstract class BaseGenericObjectP
         }
     }
 
-    
+    protected abstract void ensureMinIdle() throws Exception;
+
+
     // Monitoring (primarily JMX) related methods
-    
+
     /**
      * Provides the name under which the pool has been registered with the
      * platform MBean server or <code>null</code> if the pool has not been
      * registered.
      */
     public abstract ObjectName getJmxName();
-    
+
     /**
      * Provides the stack trace for the call that created this pool. JMX
      * registration may trigger a memory leak so it is important that pools are
      * deregistered when no longer used by calling the {@link #close()} method.
      * This method is provided to assist with identifying code that creates but
-     * does not close it thereby creating a memory leak.   
+     * does not close it thereby creating a memory leak.
      */
     public String getCreationStackTrace() {
         return creationStackTrace;
@@ -145,7 +230,7 @@ public abstract class BaseGenericObjectP
     protected final NotificationBroadcasterSupport getJmxNotificationSupport() {
         return jmxNotificationSupport;
     }
-    
+
     protected String getStackTrace(Exception e) {
         // Need the exception in string form to prevent the retention of
         // references to classes in the stack trace that could trigger a memory
@@ -155,7 +240,7 @@ public abstract class BaseGenericObjectP
         e.printStackTrace(pw);
         return w.toString();
     }
-    
+
     protected void swallowException(Exception e) {
         String msg = getStackTrace(e);
 
@@ -175,7 +260,7 @@ public abstract class BaseGenericObjectP
 
 
     // Implement NotificationEmitter interface
-        
+
     @Override
     public final void addNotificationListener(NotificationListener listener,
             NotificationFilter filter, Object handback)
@@ -218,4 +303,53 @@ public abstract class BaseGenericObjectP
         jmxNotificationSupport.removeNotificationListener(
                 listener, filter, handback);
     }
+
+
+    // Inner classes
+
+    /**
+     * The idle object evictor {@link TimerTask}.
+     *
+     * @see GenericKeyedObjectPool#setTimeBetweenEvictionRunsMillis
+     */
+    protected class Evictor extends TimerTask {
+        /**
+         * Run pool maintenance.  Evict objects qualifying for eviction and then
+         * ensure that the minimum number of idle instances are available.
+         * Since the Timer that invokes Evictors is shared for all Pools but
+         * pools may exist in different class loaders, the Evictor ensures that
+         * any actions taken are under the class loader of the factory
+         * associated with the pool.
+         */
+        @Override
+        public void run() {
+            ClassLoader savedClassLoader =
+                    Thread.currentThread().getContextClassLoader();
+            try {
+                //  set the class loader for the factory
+                Thread.currentThread().setContextClassLoader(
+                        factoryClassLoader);
+
+                //Evict from the pool
+                try {
+                    evict();
+                } catch(Exception e) {
+                    // ignored
+                } catch(OutOfMemoryError oome) {
+                    // Log problem but give evictor thread a chance to continue
+                    // in case error is recoverable
+                    oome.printStackTrace(System.err);
+                }
+                //Re-create idle instances.
+                try {
+                    ensureMinIdle();
+                } catch (Exception e) {
+                    // ignored
+                }
+            } finally {
+                // restore the previous CCL
+                Thread.currentThread().setContextClassLoader(savedClassLoader);
+            }
+        }
+    }
 }

Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java?rev=1331984&r1=1331983&r2=1331984&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java Sun Apr 29 20:01:09 2012
@@ -220,8 +220,6 @@ public class GenericKeyedObjectPool<K,T>
             GenericKeyedObjectPoolConfig config) {
         super(config);
         this.factory = factory;
-        // save the current CCL to be used later by the evictor Thread
-        factoryClassLoader = Thread.currentThread().getContextClassLoader();
 
         setConfig(config);
 
@@ -294,59 +292,6 @@ public class GenericKeyedObjectPool<K,T>
     }
 
     /**
-     * Returns the overall maximum number of objects (across pools) that can
-     * exist at one time. A negative value indicates no limit.
-     * @return the maximum number of instances in circulation at one time.
-     * @see #setMaxTotal
-     */
-    @Override
-    public int getMaxTotal() {
-        return maxTotal;
-    }
-
-    /**
-     * Sets the cap on the total number of instances from all pools combined.
-     * When <code>maxTotal</code> is set to a
-     * positive value and {@link #borrowObject borrowObject} is invoked
-     * when at the limit with no idle instances available, an attempt is made to
-     * create room by clearing the oldest 15% of the elements from the keyed
-     * pools.
-     *
-     * @param maxTotal The cap on the total number of instances across pools.
-     * Use a negative value for no limit.
-     * @see #getMaxTotal
-     */
-    public void setMaxTotal(int maxTotal) {
-        this.maxTotal = maxTotal;
-    }
-
-    /**
-     * Returns whether to block when the {@link #borrowObject} method
-     * is invoked when the pool is exhausted (the maximum number
-     * of "active" objects has been reached).
-     *
-     * @return true if the pool should block
-     * @see #setBlockWhenExhausted
-     */
-    @Override
-    public boolean getBlockWhenExhausted() {
-        return blockWhenExhausted;
-    }
-
-    /**
-     * Sets whether to block when the {@link #borrowObject} method
-     * is invoked when the pool is exhausted (the maximum number
-     * of "active" objects has been reached).
-     *
-     * @param shouldBlock true if the pool should block
-     * @see #getBlockWhenExhausted
-     */
-    public void setBlockWhenExhausted(boolean shouldBlock) {
-        blockWhenExhausted = shouldBlock;
-    }
-
-
-    /**
      * Returns the maximum amount of time (in milliseconds) the
      * {@link #borrowObject} method should block before throwing
      * an exception when the pool is exhausted and the
@@ -785,6 +730,12 @@ public class GenericKeyedObjectPool<K,T>
      * The length of time that this method will block when {@link #getBlockWhenExhausted()} is true
      * is determined by the {@link #getMaxWait() maxWait} property.</p>
      *
+     * When <code>maxTotal</code> is set to a
+     * positive value and {@link #borrowObject borrowObject} is invoked
+     * when at the limit with no idle instances available, an attempt is made to
+     * create room by clearing the oldest 15% of the elements from the keyed
+     * pools.
+     *
      * <p>When the pool is exhausted, multiple calling threads may be simultaneously blocked waiting for instances
      * to become available.  As of pool 1.5, a "fairness" algorithm has been implemented to ensure that threads receive
      * available instances in request arrival order.</p>
@@ -1346,19 +1297,13 @@ public class GenericKeyedObjectPool<K,T>
 
 
     /**
-     * <p>Perform <code>numTests</code> idle object eviction tests, evicting
-     * examined objects that meet the criteria for eviction. If
-     * <code>testWhileIdle</code> is true, examined objects are validated
-     * when visited (and removed if invalid); otherwise only objects that
-     * have been idle for more than <code>minEvicableIdletimeMillis</code>
-     * are removed.</p>
-     *
-     * <p>Successive activations of this method examine objects in keyed pools
-     * in sequence, cycling through the keys and examining objects in
-     * oldest-to-youngest order within the keyed pools.</p>
-     *
-     * @throws Exception when there is a problem evicting idle objects.
+     * {@inheritDoc}
+     * <p>
+     * Successive activations of this method examine objects in keyed pools in
+     * sequence, cycling through the keys and examining objects in
+     * oldest-to-youngest order within the keyed pools.
      */
+    @Override
     public void evict() throws Exception {
         assertOpen();
 
@@ -1644,7 +1589,8 @@ public class GenericKeyedObjectPool<K,T>
      * @see #setMinIdlePerKey
      * @throws Exception If there was an error whilst creating the pooled objects.
      */
-    private void ensureMinIdle() throws Exception {
+    @Override
+    protected void ensureMinIdle() throws Exception {
         int minIdle = getMinIdlePerKey();
         if (minIdle < 1) {
             return;
@@ -2071,50 +2017,6 @@ public class GenericKeyedObjectPool<K,T>
         }
     }
 
-    /**
-     * The idle object evictor {@link TimerTask}.
-     *
-     * @see GenericKeyedObjectPool#setTimeBetweenEvictionRunsMillis
-     */
-    private class Evictor extends TimerTask {
-        /**
-         * Run pool maintenance.  Evict objects qualifying for eviction and then
-         * invoke {@link GenericKeyedObjectPool#ensureMinIdle()}.
-         * Since the Timer that invokes Evictors is shared for all Pools, we try
-         * to restore the ContextClassLoader that created the pool.
-         */
-        @Override
-        public void run() {
-            ClassLoader savedClassLoader =
-                    Thread.currentThread().getContextClassLoader();
-            try {
-                //  set the class loader for the factory
-                Thread.currentThread().setContextClassLoader(
-                        factoryClassLoader);
-
-                //Evict from the pool
-                try {
-                    evict();
-                } catch(Exception e) {
-                    // ignored
-                } catch(OutOfMemoryError oome) {
-                    // Log problem but give evictor thread a chance to continue in
-                    // case error is recoverable
-                    oome.printStackTrace(System.err);
-                }
-                //Re-create idle instances.
-                try {
-                    ensureMinIdle();
-                } catch (Exception e) {
-                    // ignored
-                }
-            } finally {
-                // restore the previous CCL
-                Thread.currentThread().setContextClassLoader(savedClassLoader);
-            }
-        }
-    }
-
     //--- configuration attributes ---------------------------------------------
 
     /**
@@ -2141,13 +2043,6 @@ public class GenericKeyedObjectPool<K,T>
         GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
 
     /**
-     * The cap on the total number of instances from the pool if non-positive.
-     * @see #setMaxTotal
-     * @see #getMaxTotal
-     */
-    private int maxTotal = GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL;
-
-    /**
      * The maximum amount of time (in millis) the
      * {@link #borrowObject} method should block before throwing
      * an exception when the pool is exhausted and the
@@ -2164,17 +2059,6 @@ public class GenericKeyedObjectPool<K,T>
     private long maxWait = GenericKeyedObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
 
     /**
-     * When the {@link #borrowObject} method is invoked when the pool is
-     * exhausted (the maximum number of "active" objects has been reached)
-     * should the {@link #borrowObject} method block or not?
-     *
-     * @see #setBlockWhenExhausted
-     * @see #getBlockWhenExhausted
-     */
-    private boolean blockWhenExhausted =
-        GenericKeyedObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
-
-    /**
      * When <code>true</code>, objects will be
      * {@link org.apache.commons.pool2.PoolableObjectFactory#validateObject validated}
      * before being returned by the {@link #borrowObject}
@@ -2277,13 +2161,6 @@ public class GenericKeyedObjectPool<K,T>
     //--- internal attributes --------------------------------------------------
 
     /**
-     * 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.
-     */
-    private final ClassLoader factoryClassLoader;
-
-    /**
      * My hash of pools (ObjectQueue). The list of keys <b>must</b> be kept in
      * step with {@link #poolKeyList} using {@link #keyLock} to ensure any
      * changes to the list of current keys is made in a thread-safe manner.

Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1331984&r1=1331983&r2=1331984&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java Sun Apr 29 20:01:09 2012
@@ -185,8 +185,6 @@ public class GenericObjectPool<T> extend
             GenericObjectPoolConfig config) {
         super(config);
         this.factory = factory;
-        // save the current CCL to be used later by the evictor Thread
-        factoryClassLoader = Thread.currentThread().getContextClassLoader();
 
         setConfig(config);
 
@@ -235,61 +233,6 @@ public class GenericObjectPool<T> extend
     }
 
     /**
-     * Returns the maximum number of objects that can be allocated by the pool
-     * (checked out to clients, or idle awaiting checkout) at a given time. When
-     * non-positive, there is no limit to the number of objects that can be
-     * managed by the pool at one time.
-     *
-     * @return the cap on the total number of object instances managed by the
-     *         pool.
-     * @see #setMaxTotal
-     */
-    @Override
-    public int getMaxTotal() {
-        return maxTotal;
-    }
-
-    /**
-     * Sets the cap on the number of objects that can be allocated by the pool
-     * (checked out to clients, or idle awaiting checkout) at a given time. Use
-     * a negative value for no limit.
-     *
-     * @param maxTotal
-     *            The cap on the total number of object instances managed by the
-     *            pool. Negative values mean that there is no limit to the
-     *            number of objects allocated by the pool.
-     * @see #getMaxTotal
-     */
-    public void setMaxTotal(int maxTotal) {
-        this.maxTotal = maxTotal;
-    }
-
-    /**
-     * Returns whether to block when the {@link #borrowObject} method is
-     * invoked when the pool is exhausted (the maximum number of "active"
-     * objects has been reached).
-     *
-     * @return true if should block when the pool is exhuasted
-     * @see #setBlockWhenExhausted
-     */
-    @Override
-    public boolean getBlockWhenExhausted() {
-        return blockWhenExhausted;
-    }
-
-    /**
-     * Sets whether to block when the {@link #borrowObject} method is invoked
-     * when the pool is exhausted (the maximum number of "active" objects has
-     * been reached).
-     *
-     * @param blockWhenExhausted   true if should block when the pool is exhausted
-     * @see #getBlockWhenExhausted
-     */
-    public void setBlockWhenExhausted(boolean blockWhenExhausted) {
-        this.blockWhenExhausted = blockWhenExhausted;
-    }
-
-    /**
      * Returns the maximum amount of time (in milliseconds) the
      * {@link #borrowObject} method should block before throwing an exception
      * when the pool is exhausted and the {@link #getBlockWhenExhausted} is true.
@@ -1077,21 +1020,12 @@ public class GenericObjectPool<T> extend
     }
 
     /**
-     * <p>
-     * Perform <code>numTests</code> idle object eviction tests, evicting
-     * examined objects that meet the criteria for eviction. If
-     * <code>testWhileIdle</code> is true, examined objects are validated when
-     * visited (and removed if invalid); otherwise only objects that have been
-     * idle for more than <code>minEvicableIdletimeMillis</code> are removed.
-     * </p>
+     * {@inheritDoc}
      * <p>
      * Successive activations of this method examine objects in in sequence,
      * cycling through objects in oldest-to-youngest order.
-     * </p>
-     *
-     * @throws Exception
-     *             if the pool is closed or eviction fails.
      */
+    @Override
     public void evict() throws Exception {
         assertOpen();
 
@@ -1218,7 +1152,8 @@ public class GenericObjectPool<T> extend
      * @throws Exception
      *             when {@link #addObject()} fails.
      */
-    private void ensureMinIdle() throws Exception {
+    @Override
+    protected void ensureMinIdle() throws Exception {
         int minIdle = getMinIdle();
         if (minIdle < 1) {
             return;
@@ -1423,49 +1358,6 @@ public class GenericObjectPool<T> extend
         return oname;
     }
 
-    // --- inner classes ----------------------------------------------
-
-    /**
-     * The idle object evictor {@link TimerTask}.
-     *
-     * @see GenericObjectPool#setTimeBetweenEvictionRunsMillis
-     */
-    private class Evictor extends TimerTask {
-        /**
-         * Run pool maintenance. Evict objects qualifying for eviction and then
-         * invoke {@link GenericObjectPool#ensureMinIdle()}.
-         * Since the Timer that invokes Evictors is shared for all Pools, we try
-         * to restore the ContextClassLoader that created the pool.
-         */
-        @Override
-        public void run() {
-            ClassLoader savedClassLoader =
-                    Thread.currentThread().getContextClassLoader();
-            try {
-                //  set the class loader for the factory
-                Thread.currentThread().setContextClassLoader(
-                        factoryClassLoader);
-                try {
-                    evict();
-                } catch (Exception e) {
-                    // ignored
-                } catch (OutOfMemoryError oome) {
-                    // Log problem but give evictor thread a chance to continue
-                    // in case error is recoverable
-                    oome.printStackTrace(System.err);
-                }
-                try {
-                    ensureMinIdle();
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    // ignored
-                }
-            } finally {
-                // restore the previous CCL
-                Thread.currentThread().setContextClassLoader(savedClassLoader);
-            }
-        }
-    }
 
     // --- configuration attributes --------------------------------------------
 
@@ -1486,15 +1378,6 @@ public class GenericObjectPool<T> extend
     private volatile int minIdle = GenericObjectPoolConfig.DEFAULT_MIN_IDLE;
 
     /**
-     * The cap on the total number of active instances from the pool.
-     *
-     * @see #setMaxTotal
-     * @see #getMaxTotal
-     */
-    private volatile int maxTotal =
-        GenericObjectPoolConfig.DEFAULT_MAX_TOTAL;
-
-    /**
      * The maximum amount of time (in millis) the {@link #borrowObject} method
      * should block before throwing an exception when the pool is exhausted and
      * {@link #getBlockWhenExhausted()} is true.
@@ -1510,17 +1393,6 @@ public class GenericObjectPool<T> extend
             GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
 
     /**
-     * When the {@link #borrowObject} method is invoked when the pool is
-     * exhausted (the maximum number of "active" objects has been reached)
-     * should the {@link #borrowObject} method block or not?
-     *
-     * @see #setBlockWhenExhausted
-     * @see #getBlockWhenExhausted
-     */
-    private volatile boolean blockWhenExhausted =
-        GenericObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
-
-    /**
      * When <tt>true</tt>, objects will be
      * {@link PoolableObjectFactory#validateObject validated} before being
      * returned by the {@link #borrowObject} method. If the object fails to
@@ -1620,13 +1492,6 @@ public class GenericObjectPool<T> extend
     // --- internal attributes -------------------------------------------------
 
     /**
-     * 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.
-     */
-    private final ClassLoader factoryClassLoader;
-
-    /**
      * All of the objects currently associated with this pool in any state. It
      * excludes objects that have been destroyed. The size of
      * {@link #allObjects} will always be less than or equal to {@link