OutOfMemory provoked by Cache overflow
--------------------------------------

                 Key: OFBIZ-2186
                 URL: https://issues.apache.org/jira/browse/OFBIZ-2186
             Project: OFBiz
          Issue Type: Bug
          Components: framework
    Affects Versions: SVN trunk, Release Branch 4.0
         Environment: Linux, JDK 1.5_15, Xmx set to 1156Mo
            Reporter: Philippe Mouawad
            Priority: Critical


In our production system, we had an OutOfMemoryError.
I analyzed the generated Heap Dump and found the following:
The cache entitycache.entity-list.default.ProductCategoryMember retains a heap 
of 369314128 Bytes.
The LRUMap hold by this object is occupying this space (369314128) and this 
object has a stange state:
- maxSize is set to 5000 (as set in the cache.properties)
- size is 128930 => PROBLEM

IN cache.properties:
entitycache.entity-list.default.ProductCategoryMember.expireTime=3600000
entitycache.entity-list.default.ProductCategoryMember.useSoftReference=true
entitycache.entity-list.default.ProductCategoryMember.maxInMemory=5000
entitycache.entity-list.default.ProductCategoryMember.maxSize=7500


I analyzed the code of LRUMap and its usage in CacheLineTable and IMHO the bug 
is a missing synchonized  in get():
public CacheLine<V> get(Object key) {
        if (key == null) {
            if (Debug.verboseOn()) Debug.logVerbose("In CacheLineTable tried to 
get with null key, using NullObject" + this.cacheName, module);
        }
        return getNoCheck(key);
    }


Since LRUMap extends LinkedHashMap, if you look at get method, it changes the 
state of the Map by calling e.recordAccess(this):
    public V get(Object key) {
        Entry<K,V> e = (Entry<K,V>)getEntry(key);
        if (e == null)
            return null;
        e.recordAccess(this);
        return e.value;
    }

So the default of synchronization corrupts the state of LRUMap which grows 
indefinitely
I will submit a patch for this on the trunk.
Philippe
www.ubik-ingenierie.com

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to