commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Clebert Suconic <csuco...@redhat.com>
Subject Circular Reference on WeakHashMap
Date Mon, 06 Aug 2007 22:11:23 GMT
I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a 
investigation on this:

http://jira.jboss.com/jira/browse/JBAS-2299

(Which is not actually an issue with JBAS, but an issue when using 
BeanUtils as part of the classPath).


There is a circular reference on the WeakHashMap, The WeakHashMap will 
have the ClassLoader as the key, and it will have a reference back to 
the Key from one of the Reflection objects. This doesn't work! (Please.. 
no discussions about this point.. if you don't believe me, do some 
testing with simple stuff before discussing this and come back to me 
only after that)


org.jboss.web.tomcat.service.WebAppClassLoader@16334564
!--- sun.reflect.DelegatingClassLoader@27651708
!--- !--- class sun.reflect.GeneratedConstructorAccessor38
!--- !--- !--- [Ljava.lang.Object;@10800875
!--- !--- !--- !--- java.util.Vector@838806
!--- !--- !--- !--- !--- sun.reflect.DelegatingClassLoader@27651708
!--- !--- !--- !--- !--- !--- class 
sun.reflect.GeneratedConstructorAccessor38
!--- !--- !--- !--- !--- !--- !--- class java.lang.Class
!--- !--- !--- !--- !--- !--- !--- !--- 
org.apache.commons.beanutils.converters.ClassConverter@22616909
!--- !--- !--- !--- !--- !--- !--- !--- !--- 
org.apache.commons.beanutils.converters.ArrayConverter@18888821
!--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
org.apache.commons.beanutils.converters.ConverterFacade@13619754
!--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
java.util.HashMap$Entry@32434103
!--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
[Ljava.util.HashMap$Entry;@28236766
!--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
java.util.HashMap@14997495
!--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
org.apache.commons.beanutils.ConvertUtilsBean@2016953
!--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
!--- org.apache.commons.beanutils.BeanUtilsBean@30487951
!---!---!---!---!---!---!---!---!---!---!---!---!---!---!---!--- 
FieldReference private java.lang.Object 
java.util.WeakHashMap$Entry.value=java.util.WeakHashMap$Entry@23775534 
Detail

I don't know if I'm preaching to the choir, but just in case this is new 
information to someone... you should aways keep Reflection referenced as 
SoftReferences (if you really have to). Reflection is aways a new object 
so a WeakReference is too weak.

On JBossSerialization I have solved this using an interesting way. I 
called it PersistentReference. I'm using SoftReferences, and keeping the 
information to recreate it case the SoftReference is cleared:

http://fisheye.jboss.org/browse/JBoss/jboss-serialization/src/org/jboss/serial/references/PersistentReference.java?r=1.3


And also... you guys should write a testcase to validate if the Caching 
is being cleared. (I don't know if you have one).

http://anonsvn.jboss.org/repos/jbossserialization/trunk/tests/org/jboss/serial/memory/MemoryLeakTestCase.java

You don't need to use the jboss-profiler API for this.. just create a 
WeakReference to a new ClassLoader, and validate if it was released at 
the end after some exercizing some code on this caching. You will 
probably need to fill your memory almost to 100% on the test as 
SoftReference are only gone when the memory is low.


Clebert Suconic

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message