[hibernate-issues] [Hibernate-JIRA] Closed: (HHH-1328) org.hibernate.util.SimpleMRUCache keeps a soft reference to the cache key, so cached values get collected prematurely
Steve Ebersole (JIRA)
noreply at atlassian.com
Mon Mar 21 13:01:12 EDT 2011
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1328?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Steve Ebersole closed HHH-1328.
-------------------------------
Closing stale resolved issues
> org.hibernate.util.SimpleMRUCache keeps a soft reference to the cache key, so cached values get collected prematurely
> ---------------------------------------------------------------------------------------------------------------------
>
> Key: HHH-1328
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1328
> Project: Hibernate Core
> Issue Type: Bug
> Components: core
> Environment: Hibernate 3.1. I believe this hasn't changed in CVS.
> Reporter: Tzvetan Mikov
> Assignee: Steve Ebersole
> Priority: Minor
> Fix For: 3.1.1
>
>
> org.hibernate.util.SimpleMRUCache uses org.apache.commons.collections.ReferenceMap to map HQLQueryPlanKey to HQLQueryPlan. However both the value and the key are stored with soft references. The last 128 HQLQueryPlan-s are kept in a strong reference array, but the cache keys aren't, so often cache entries cannot be found, even though the values still exist in memory.
> There is a comment in the source saying:
> // both keys and values may be soft since value keeps a hard ref to the key (and there is a hard ref to MRU values)
> but it isn't actually true since the value (HQLQueryPlan) doesn't actually keep a reference to the key (HQLQueryPlanKey).
> This is a simplistic patch that should fix the problem:
> --- SimpleMRUCache.java 2005-12-12 07:03:46.000000000 -0800
> +++ SimpleMRUCache-new.java 2005-12-28 18:34:09.920112661 -0800
> @@ -16,20 +16,24 @@
>
> private static final int MAX_STRONG_REF_COUNT = 128; //TODO: configurable?
> private final transient Object[] strongRefs = new Object[MAX_STRONG_REF_COUNT]; //strong reference to MRU queries
> + private final transient Object[] strongKeyRefs = new Object[MAX_STRONG_REF_COUNT];
> private transient int strongRefIndex = 0;
> private final transient Map softQueryCache = new ReferenceMap(ReferenceMap.SOFT, ReferenceMap.SOFT) ;
> - // both keys and values may be soft since value keeps a hard ref to the key (and there is a hard ref to MRU values)
>
> public synchronized Object get(Object key) {
> Object result = softQueryCache.get( key );
> if( result != null ) {
> - strongRefs[ ++strongRefIndex % MAX_STRONG_REF_COUNT ] = result;
> + ++strongRefIndex;
> + strongRefs[ strongRefIndex % MAX_STRONG_REF_COUNT ] = result;
> + strongKeyRefs[ strongRefIndex % MAX_STRONG_REF_COUNT ] = key;
> }
> return result;
> }
>
> public void put(Object key, Object value) {
> softQueryCache.put( key, value );
> - strongRefs[ ++strongRefIndex % MAX_STRONG_REF_COUNT ] = value;
> + ++strongRefIndex;
> + strongRefs[ strongRefIndex % MAX_STRONG_REF_COUNT ] = value;
> + strongKeyRefs[ strongRefIndex % MAX_STRONG_REF_COUNT ] = key;
> }
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list