Index: src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
===================================================================
--- src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java	(revision 550085)
+++ src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java	(working copy)
@@ -23,6 +23,7 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.Timer;
 import java.util.TreeMap;
 import java.util.LinkedList;
 import java.util.HashSet;
@@ -1191,6 +1192,9 @@
                 _evictor.cancel();
                 _evictor = null;
             }
+            if (null != _evictionTimer) {
+                _evictionTimer.cancel();
+            }
         }
     }
 
@@ -1362,7 +1366,10 @@
         }
         if(delay > 0) {
             _evictor = new Evictor();
-            GenericObjectPool.EVICTION_TIMER.schedule(_evictor, delay, delay);
+            if (_evictionTimer == null) {
+                _evictionTimer = new Timer(true);
+            }
+            _evictionTimer.schedule(_evictor, delay, delay);
         }
     }
 
@@ -1724,4 +1731,9 @@
      * Position in the _pool where the _evictor last stopped.
      */
     private int _evictLastIndex = -1;
+    
+    /**
+     * Idle object eviction timer.
+     */
+    private Timer _evictionTimer = null;
 }
Index: src/java/org/apache/commons/pool/impl/GenericObjectPool.java
===================================================================
--- src/java/org/apache/commons/pool/impl/GenericObjectPool.java	(revision 550085)
+++ src/java/org/apache/commons/pool/impl/GenericObjectPool.java	(working copy)
@@ -271,13 +271,6 @@
      */
     public static final long DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS = -1;
 
-    //--- package constants -------------------------------------------
-
-    /**
-     * Idle object evition Timer. Shared between all {@link GenericObjectPool}s and {@link GenericKeyedObjectPool} s.
-     */
-    static final Timer EVICTION_TIMER = new Timer(true);
-
     //--- constructors -----------------------------------------------
 
     /**
@@ -1008,6 +1001,9 @@
         synchronized (this) {
             clear();
             startEvictor(-1L);
+            if (null != _evictionTimer) {
+                _evictionTimer.cancel();
+            }
         }
     }
 
@@ -1148,7 +1144,10 @@
         }
         if(delay > 0) {
             _evictor = new Evictor();
-            EVICTION_TIMER.schedule(_evictor, delay, delay);
+            if (_evictionTimer == null) {
+                _evictionTimer = new Timer(true);
+            }
+            _evictionTimer.schedule(_evictor, delay, delay);
         }
     }
 
@@ -1418,4 +1417,9 @@
      * Position in the _pool where the _evictor last stopped.
      */
     private int evictLastIndex = -1;
+    
+    /**
+     * Idle object eviction timer.
+     */
+    private Timer _evictionTimer = null;
 }
