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); + } }
