[ 
https://issues.apache.org/jira/browse/BEANUTILS-291?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12586430#action_12586430
 ] 

Clebert Rezende Suconic commented on BEANUTILS-291:
---------------------------------------------------

I see one problem on MappedPropertyDescriptor.java

There is nothing testing if mappedReadMethodRef.get()==null, then recreate it.


Reflection is an unique object on the JVM. Everything you do class.getmethod 
(or getField.. whatever), you get a new object.


Since this is using SoftReference, when the memory goes low, you will certainly 
loose the reference to ReadMethod, but the class will still be loaded (and 
valid). So, on that case you need to do a:

if (mappedReadMethodRef.get() == null)
{
     mappedReadMethod = createReferenceAgain();
}

// this is a fictitious name... just to illustrate the idea: 
public synchronized createReferenceAgain()
{
 ...
}

To correctly testcase this scenario on SoftReferences, you should get a 
BeanDescriptor (forcing the creation of MappedPropertyDescriptor), force a 
OutOfmemoryError, and then make an operation again.  I didn't do any tests yet 
but I believe you would have a NPE on that scenario.


> Circular Reference on WeakHashMap
> ---------------------------------
>
>                 Key: BEANUTILS-291
>                 URL: https://issues.apache.org/jira/browse/BEANUTILS-291
>             Project: Commons BeanUtils
>          Issue Type: Bug
>          Components: Bean / Property Utils
>    Affects Versions: 1.8.0-BETA
>            Reporter: Niall Pemberton
>             Fix For: 1.8.0
>
>         Attachments: BEANUTILS-291-FixMemoryLeaks-v2.patch, 
> memoryLeakTests-new.zip, PropertyUtilsBean.java
>
>
> Clebert Suconic wrote on the [EMAIL PROTECTED] list  ....
> (see http://tinyurl.com/2a9gan)
> 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)
> [EMAIL PROTECTED]
> !--- [EMAIL PROTECTED]
> !--- !--- class sun.reflect.GeneratedConstructorAccessor38
> !--- !--- !--- [Ljava.lang.Object;@10800875
> !--- !--- !--- !--- [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- !--- class sun.reflect.GeneratedConstructorAccessor38
> !--- !--- !--- !--- !--- !--- !--- class java.lang.Class
> !--- !--- !--- !--- !--- !--- !--- !--- [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !--- [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
> [Ljava.util.HashMap$Entry;@28236766
> !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- [EMAIL 
> PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- [EMAIL 
> PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- !--- 
> [EMAIL PROTECTED]
> !--- !--- !--- !--- !--- !--- !--- !--- !-- -!--- !--- !--- !--- !--- !--- 
> !---FieldReference private java.lang.Object [EMAIL PROTECTED] 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.

-- 
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