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.