It would be nice if we had a test for this.

-Adrian

On 3/23/2011 1:44 PM, [email protected] wrote:
Author: erwan
Date: Wed Mar 23 20:44:17 2011
New Revision: 1084732

URL: http://svn.apache.org/viewvc?rev=1084732&view=rev
Log:
OFBIZ-4220 a patch from Philippe Mouawad: Current implementation of UtilCache 
has a memory leak if maxInMemory is set

Modified:
     ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/UtilCache.java

Modified: 
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/UtilCache.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/UtilCache.java?rev=1084732&r1=1084731&r2=1084732&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/UtilCache.java 
(original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/UtilCache.java Wed 
Mar 23 20:44:17 2011
@@ -49,6 +49,7 @@ import org.ofbiz.base.util.UtilObject;
  import org.ofbiz.base.util.UtilValidate;

  import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
+import com.googlecode.concurrentlinkedhashmap.EvictionListener;
  import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap.Builder;

  /**
@@ -63,8 +64,8 @@ import com.googlecode.concurrentlinkedha
   *
   */
  @SuppressWarnings("serial")
-public class UtilCache<K, V>  implements Serializable {
-
+public class UtilCache<K, V>  implements Serializable, EvictionListener<Object, 
CacheLine<V>>  {
+       
      public static final String module = UtilCache.class.getName();

      /** A static Map to keep track of all of the UtilCache instances. */
@@ -143,6 +144,7 @@ public class UtilCache<K, V>  implements
          } else {
              memoryTable = new Builder<Object, CacheLine<V>>()
              .maximumWeightedCapacity(maxMemSize)
+            .listener(this)
              .build();
          }
          if (this.useFileSystemStore) {
@@ -1027,4 +1029,9 @@ public class UtilCache<K, V>  implements
      public static<K, V>  UtilCache<K, V>  findCache(String cacheName) {
          return (UtilCache<K, V>) UtilCache.utilCacheTable.get(cacheName);
      }
+
+       @Override
+       public void onEviction(Object key, CacheLine<V>  value) {
+               ExecutionPool.removePulse(value);
+       }
  }


Reply via email to