You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Clebert Suconic <cs...@redhat.com> on 2007/08/07 00:11:23 UTC

Circular Reference on WeakHashMap

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


Re: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
 >> if you don't believe me, do some
 >> testing with simple stuff before discussing this and come back to me
 >> only after that)
 >
 > OK I will.

What I meant about with "no discussion" is.. usually people tend to 
disagree a circular REference on a WeakHashMap<ClassLoader>, 
SomeObject<ClassLoader>> would generate redeployment leaks.

Of course we can discuss this, if you just want to understand the issue

 > Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
 > September) - so unless someone else picks this up - ii don't have time
 > to look at this until after that. Do you mind if we move the
 > discussion over to that Jira ticket I opened though?

Are you coming back before the final release?

I'm flooded now with other tasks.. I can't do this myself.. but I would 
lend a hand to someone (or you when you're back) doing it through this 
forum if you like.


Niall Pemberton wrote:
> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
>> investigation on this:
>>
>> http://jira.jboss.com/jira/browse/JBAS-2299
> 
> Thanks for getting back to us so quickly.
> 
>> (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)
> 
> OK I will.
> 
>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
> seems to be somewhat messed up in posting here - so I've (hopefully)
> cleaned it up and re-posted in a Jira ticket I've opened for this
> here:
> 
> https://issues.apache.org/jira/browse/BEANUTILS-291
> 
>> 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.
> 
> Preach away - I have no great knowledge of this stuff.
> 
>> 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.
> 
> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
> September) - so unless someone else picks this up - ii don't have time
> to look at this until after that. Do you mind if we move the
> discussion over to that Jira ticket I opened though?
> 
> Niall
> 
>> Clebert Suconic


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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
I just added the testcase to this JIRA:

https://issues.apache.org/jira/browse/BEANUTILS-291


And it replicated the problem as expected... The test fails as 
expected... I have done some double checks, and it is the same scenario 
as it would happen on any application server.


Niall Pemberton wrote:
> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>>  > Yes, but that reference can be garbage collected - so would have to
>>  > handle that as well. In this instance each AbstractConverter
>>  > implementation only ever returns the same value - so I think its
>>  > simpler to remove the class reference - for example in
>>  > IntegerConverter it would just have:
>>
>> no... it won't...
>>
>> As long as the ClassLoader is referenced somewhere, the WeakReference
>> won't die. This is different on Reflection, as any class.getMethod()
>> would return a brand new Method.
> 
> Ahhh OK.
> 
>> You probably have a WeakHashMap<ClassLoader, Cache>
>>
>>
>> When any application server releases the reference to classLoader, your
>> WeakhashMap will automatically remove the element on the map, as long as
>> you don't have Circular references to ClassLoader on the value:
>>
>> There is a WIKI page I wrote about this, where I have written some
>> information about it:
>>
>> http://wiki.jboss.org/wiki/Wiki.jsp?page=ClassLeakage
> 
> Great, thanks I'll take a look.
> 
> Niall
> 
>> Niall Pemberton wrote:
>>> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>>>>  > Yes it does (thru' AbstractConveter which it extends) - I can remove
>>>>  > that reference completely by just making the getDefaultType() method
>>>>  > abstract and having each implementation implement it.
>>>>  >
>>>>
>>>> Just an idea... You could just have the Abstract class holding a
>>>> WeakReference and then:
>>>>
>>>> WeakReference clazz;
>>>>
>>>> public void setClazz(Class clazz)
>>>> {
>>>>    this.clazz = new WeakReference(clazz);
>>>> }
>>>>
>>>> public Class getClazz()
>>>> {
>>>>     return (Class) clazz.get();
>>>> }
>>> Yes, but that reference can be garbage collected - so would have to
>>> handle that as well. In this instance each AbstractConverter
>>> implementation only ever returns the same value - so I think its
>>> simpler to remove the class reference - for example in
>>> IntegerConverter it would just have:
>>>
>>>     protected Class getDefaultType() {
>>>         return Integer.class;
>>>     }
>>>
>>> Niall
>>>
>>>> Niall Pemberton wrote:
>>>>> Woops, should have gone to dev@ list
>>>>>
>>>>> ---------- Forwarded message ----------
>>>>> From: Niall Pemberton <ni...@gmail.com>
>>>>> Date: Aug 7, 2007 2:36 AM
>>>>> Subject: Re: Circular Reference on WeakHashMap
>>>>> To: Clebert Suconic <cs...@redhat.com>
>>>>>
>>>>>
>>>>> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>>>>>> The solution seems simpler than I thought though...
>>>>>>
>>>>>> After looking at the report again...
>>>>>> org.apache.commons.beanutils.converters.ClassConverter@22616909
>>>>>>
>>>>>> ClassConverter  probably has a reference to Class... I thought this was
>>>>>> a reflection object.
>>>>>>
>>>>>> It should be WeakReference<Class>.
>>>>> Yes it does (thru' AbstractConveter which it extends) - I can remove
>>>>> that reference completely by just making the getDefaultType() method
>>>>> abstract and having each implementation implement it.
>>>>>
>>>>>> And... inspect your code for any other reflection usages.
>>>>> OK when I get back I was going to have a play with JVMTIInterface - looks good.
>>>>>
>>>>> Niall
>>>>>
>>>>>> Niall Pemberton wrote:
>>>>>>> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
>>>>>>>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
>>>>>>>> investigation on this:
>>>>>>>>
>>>>>>>> http://jira.jboss.com/jira/browse/JBAS-2299
>>>>>>> Thanks for getting back to us so quickly.
>>>>>>>
>>>>>>>> (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)
>>>>>>> OK I will.
>>>>>>>
>>>>>>>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
>>>>>>> seems to be somewhat messed up in posting here - so I've (hopefully)
>>>>>>> cleaned it up and re-posted in a Jira ticket I've opened for this
>>>>>>> here:
>>>>>>>
>>>>>>> https://issues.apache.org/jira/browse/BEANUTILS-291
>>>>>>>
>>>>>>>> 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.
>>>>>>> Preach away - I have no great knowledge of this stuff.
>>>>>>>
>>>>>>>> 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.
>>>>>>> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
>>>>>>> September) - so unless someone else picks this up - ii don't have time
>>>>>>> to look at this until after that. Do you mind if we move the
>>>>>>> discussion over to that Jira ticket I opened though?
>>>>>>>
>>>>>>> Niall
>>>>>>>
>>>>>>>> Clebert Suconic
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>
>>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>>
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 


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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Niall Pemberton <ni...@gmail.com>.
On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>  > Yes, but that reference can be garbage collected - so would have to
>  > handle that as well. In this instance each AbstractConverter
>  > implementation only ever returns the same value - so I think its
>  > simpler to remove the class reference - for example in
>  > IntegerConverter it would just have:
>
> no... it won't...
>
> As long as the ClassLoader is referenced somewhere, the WeakReference
> won't die. This is different on Reflection, as any class.getMethod()
> would return a brand new Method.

Ahhh OK.

> You probably have a WeakHashMap<ClassLoader, Cache>
>
>
> When any application server releases the reference to classLoader, your
> WeakhashMap will automatically remove the element on the map, as long as
> you don't have Circular references to ClassLoader on the value:
>
> There is a WIKI page I wrote about this, where I have written some
> information about it:
>
> http://wiki.jboss.org/wiki/Wiki.jsp?page=ClassLeakage

Great, thanks I'll take a look.

Niall

> Niall Pemberton wrote:
> > On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>  > Yes it does (thru' AbstractConveter which it extends) - I can remove
> >>  > that reference completely by just making the getDefaultType() method
> >>  > abstract and having each implementation implement it.
> >>  >
> >>
> >> Just an idea... You could just have the Abstract class holding a
> >> WeakReference and then:
> >>
> >> WeakReference clazz;
> >>
> >> public void setClazz(Class clazz)
> >> {
> >>    this.clazz = new WeakReference(clazz);
> >> }
> >>
> >> public Class getClazz()
> >> {
> >>     return (Class) clazz.get();
> >> }
> >
> > Yes, but that reference can be garbage collected - so would have to
> > handle that as well. In this instance each AbstractConverter
> > implementation only ever returns the same value - so I think its
> > simpler to remove the class reference - for example in
> > IntegerConverter it would just have:
> >
> >     protected Class getDefaultType() {
> >         return Integer.class;
> >     }
> >
> > Niall
> >
> >> Niall Pemberton wrote:
> >>> Woops, should have gone to dev@ list
> >>>
> >>> ---------- Forwarded message ----------
> >>> From: Niall Pemberton <ni...@gmail.com>
> >>> Date: Aug 7, 2007 2:36 AM
> >>> Subject: Re: Circular Reference on WeakHashMap
> >>> To: Clebert Suconic <cs...@redhat.com>
> >>>
> >>>
> >>> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>>> The solution seems simpler than I thought though...
> >>>>
> >>>> After looking at the report again...
> >>>> org.apache.commons.beanutils.converters.ClassConverter@22616909
> >>>>
> >>>> ClassConverter  probably has a reference to Class... I thought this was
> >>>> a reflection object.
> >>>>
> >>>> It should be WeakReference<Class>.
> >>> Yes it does (thru' AbstractConveter which it extends) - I can remove
> >>> that reference completely by just making the getDefaultType() method
> >>> abstract and having each implementation implement it.
> >>>
> >>>> And... inspect your code for any other reflection usages.
> >>> OK when I get back I was going to have a play with JVMTIInterface - looks good.
> >>>
> >>> Niall
> >>>
> >>>> Niall Pemberton wrote:
> >>>>> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>>>>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
> >>>>>> investigation on this:
> >>>>>>
> >>>>>> http://jira.jboss.com/jira/browse/JBAS-2299
> >>>>> Thanks for getting back to us so quickly.
> >>>>>
> >>>>>> (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)
> >>>>> OK I will.
> >>>>>
> >>>>>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
> >>>>> seems to be somewhat messed up in posting here - so I've (hopefully)
> >>>>> cleaned it up and re-posted in a Jira ticket I've opened for this
> >>>>> here:
> >>>>>
> >>>>> https://issues.apache.org/jira/browse/BEANUTILS-291
> >>>>>
> >>>>>> 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.
> >>>>> Preach away - I have no great knowledge of this stuff.
> >>>>>
> >>>>>> 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.
> >>>>> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
> >>>>> September) - so unless someone else picks this up - ii don't have time
> >>>>> to look at this until after that. Do you mind if we move the
> >>>>> discussion over to that Jira ticket I opened though?
> >>>>>
> >>>>> Niall
> >>>>>
> >>>>>> Clebert Suconic
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> >>> For additional commands, e-mail: dev-help@commons.apache.org
> >>>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> >> For additional commands, e-mail: dev-help@commons.apache.org
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> > For additional commands, e-mail: dev-help@commons.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
The insomnia got me today...  Couldn't sleep! :-)
https://issues.apache.org/jira/browse/BEANUTILS-291

There is a proposed fix on the JIRA.. it works!

Nice.. isn't?


The idea is to use a WeakHashMap<ClassLoader, FastHashMap> on the 
Property also. I don't think this would cause performance issues, since 
WeakhashMap would have just few lines, and it would be released fairly 
quickly. Someone could create a ConcurrentWeakHashMap for that though... 
(I have created one for JBossSerialization already.. but there is not 
secret on that)

Whoever apply the fix, please run the testcase without the fix, and then 
with the fix.


The memory leak testcase needs to be expanded though... I don't know for 
instance if DynaBeans would cause a leak or not, since they are not 
being used on this test.

And this gets a nice idea about how you would fix any similar bugs.


Any chance this will be applied before 1.8 final?


Clebert


Clebert Suconic wrote:
>  > should the second sample on the wiki page not contain
>  > SoftReference reference = new SoftReference(x); instead of
>  > WeakReference reference = new WeakReference(x); ?
> 
> Yep! :-) Just fixed it.
> 
> Thanks!
> 
> Clebert
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 


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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
 > should the second sample on the wiki page not contain
 > SoftReference reference = new SoftReference(x); instead of
 > WeakReference reference = new WeakReference(x); ?

Yep! :-) Just fixed it.

Thanks!

Clebert



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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Heinz Drews <he...@gmail.com>.
Hello Clebert,

should the second sample on the wiki page not contain
SoftReference reference = new SoftReference(x); instead of
WeakReference reference = new WeakReference(x); ?

Regards,
Heinz

On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>  > Yes, but that reference can be garbage collected - so would have to
>  > handle that as well. In this instance each AbstractConverter
>  > implementation only ever returns the same value - so I think its
>  > simpler to remove the class reference - for example in
>  > IntegerConverter it would just have:
>
> no... it won't...
>
> As long as the ClassLoader is referenced somewhere, the WeakReference
> won't die. This is different on Reflection, as any class.getMethod()
> would return a brand new Method.
>
>
> You probably have a WeakHashMap<ClassLoader, Cache>
>
>
> When any application server releases the reference to classLoader, your
> WeakhashMap will automatically remove the element on the map, as long as
> you don't have Circular references to ClassLoader on the value:
>
>
> There is a WIKI page I wrote about this, where I have written some
> information about it:
>
>
> http://wiki.jboss.org/wiki/Wiki.jsp?page=ClassLeakage
>
> Niall Pemberton wrote:
> > On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>  > Yes it does (thru' AbstractConveter which it extends) - I can remove
> >>  > that reference completely by just making the getDefaultType() method
> >>  > abstract and having each implementation implement it.
> >>  >
> >>
> >> Just an idea... You could just have the Abstract class holding a
> >> WeakReference and then:
> >>
> >> WeakReference clazz;
> >>
> >> public void setClazz(Class clazz)
> >> {
> >>    this.clazz = new WeakReference(clazz);
> >> }
> >>
> >> public Class getClazz()
> >> {
> >>     return (Class) clazz.get();
> >> }
> >
> > Yes, but that reference can be garbage collected - so would have to
> > handle that as well. In this instance each AbstractConverter
> > implementation only ever returns the same value - so I think its
> > simpler to remove the class reference - for example in
> > IntegerConverter it would just have:
> >
> >     protected Class getDefaultType() {
> >         return Integer.class;
> >     }
> >
> > Niall
> >
> >> Niall Pemberton wrote:
> >>> Woops, should have gone to dev@ list
> >>>
> >>> ---------- Forwarded message ----------
> >>> From: Niall Pemberton <ni...@gmail.com>
> >>> Date: Aug 7, 2007 2:36 AM
> >>> Subject: Re: Circular Reference on WeakHashMap
> >>> To: Clebert Suconic <cs...@redhat.com>
> >>>
> >>>
> >>> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>>> The solution seems simpler than I thought though...
> >>>>
> >>>> After looking at the report again...
> >>>> org.apache.commons.beanutils.converters.ClassConverter@22616909
> >>>>
> >>>> ClassConverter  probably has a reference to Class... I thought this was
> >>>> a reflection object.
> >>>>
> >>>> It should be WeakReference<Class>.
> >>> Yes it does (thru' AbstractConveter which it extends) - I can remove
> >>> that reference completely by just making the getDefaultType() method
> >>> abstract and having each implementation implement it.
> >>>
> >>>> And... inspect your code for any other reflection usages.
> >>> OK when I get back I was going to have a play with JVMTIInterface - looks good.
> >>>
> >>> Niall
> >>>
> >>>> Niall Pemberton wrote:
> >>>>> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>>>>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
> >>>>>> investigation on this:
> >>>>>>
> >>>>>> http://jira.jboss.com/jira/browse/JBAS-2299
> >>>>> Thanks for getting back to us so quickly.
> >>>>>
> >>>>>> (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)
> >>>>> OK I will.
> >>>>>
> >>>>>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
> >>>>> seems to be somewhat messed up in posting here - so I've (hopefully)
> >>>>> cleaned it up and re-posted in a Jira ticket I've opened for this
> >>>>> here:
> >>>>>
> >>>>> https://issues.apache.org/jira/browse/BEANUTILS-291
> >>>>>
> >>>>>> 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.
> >>>>> Preach away - I have no great knowledge of this stuff.
> >>>>>
> >>>>>> 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.
> >>>>> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
> >>>>> September) - so unless someone else picks this up - ii don't have time
> >>>>> to look at this until after that. Do you mind if we move the
> >>>>> discussion over to that Jira ticket I opened though?
> >>>>>
> >>>>> Niall
> >>>>>
> >>>>>> Clebert Suconic
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> >>> For additional commands, e-mail: dev-help@commons.apache.org
> >>>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> >> For additional commands, e-mail: dev-help@commons.apache.org
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> > For additional commands, e-mail: dev-help@commons.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
 > Yes, but that reference can be garbage collected - so would have to
 > handle that as well. In this instance each AbstractConverter
 > implementation only ever returns the same value - so I think its
 > simpler to remove the class reference - for example in
 > IntegerConverter it would just have:

no... it won't...

As long as the ClassLoader is referenced somewhere, the WeakReference 
won't die. This is different on Reflection, as any class.getMethod() 
would return a brand new Method.


You probably have a WeakHashMap<ClassLoader, Cache>


When any application server releases the reference to classLoader, your 
WeakhashMap will automatically remove the element on the map, as long as 
you don't have Circular references to ClassLoader on the value:


There is a WIKI page I wrote about this, where I have written some 
information about it:


http://wiki.jboss.org/wiki/Wiki.jsp?page=ClassLeakage

Niall Pemberton wrote:
> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>>  > Yes it does (thru' AbstractConveter which it extends) - I can remove
>>  > that reference completely by just making the getDefaultType() method
>>  > abstract and having each implementation implement it.
>>  >
>>
>> Just an idea... You could just have the Abstract class holding a
>> WeakReference and then:
>>
>> WeakReference clazz;
>>
>> public void setClazz(Class clazz)
>> {
>>    this.clazz = new WeakReference(clazz);
>> }
>>
>> public Class getClazz()
>> {
>>     return (Class) clazz.get();
>> }
> 
> Yes, but that reference can be garbage collected - so would have to
> handle that as well. In this instance each AbstractConverter
> implementation only ever returns the same value - so I think its
> simpler to remove the class reference - for example in
> IntegerConverter it would just have:
> 
>     protected Class getDefaultType() {
>         return Integer.class;
>     }
> 
> Niall
> 
>> Niall Pemberton wrote:
>>> Woops, should have gone to dev@ list
>>>
>>> ---------- Forwarded message ----------
>>> From: Niall Pemberton <ni...@gmail.com>
>>> Date: Aug 7, 2007 2:36 AM
>>> Subject: Re: Circular Reference on WeakHashMap
>>> To: Clebert Suconic <cs...@redhat.com>
>>>
>>>
>>> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>>>> The solution seems simpler than I thought though...
>>>>
>>>> After looking at the report again...
>>>> org.apache.commons.beanutils.converters.ClassConverter@22616909
>>>>
>>>> ClassConverter  probably has a reference to Class... I thought this was
>>>> a reflection object.
>>>>
>>>> It should be WeakReference<Class>.
>>> Yes it does (thru' AbstractConveter which it extends) - I can remove
>>> that reference completely by just making the getDefaultType() method
>>> abstract and having each implementation implement it.
>>>
>>>> And... inspect your code for any other reflection usages.
>>> OK when I get back I was going to have a play with JVMTIInterface - looks good.
>>>
>>> Niall
>>>
>>>> Niall Pemberton wrote:
>>>>> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
>>>>>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
>>>>>> investigation on this:
>>>>>>
>>>>>> http://jira.jboss.com/jira/browse/JBAS-2299
>>>>> Thanks for getting back to us so quickly.
>>>>>
>>>>>> (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)
>>>>> OK I will.
>>>>>
>>>>>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
>>>>> seems to be somewhat messed up in posting here - so I've (hopefully)
>>>>> cleaned it up and re-posted in a Jira ticket I've opened for this
>>>>> here:
>>>>>
>>>>> https://issues.apache.org/jira/browse/BEANUTILS-291
>>>>>
>>>>>> 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.
>>>>> Preach away - I have no great knowledge of this stuff.
>>>>>
>>>>>> 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.
>>>>> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
>>>>> September) - so unless someone else picks this up - ii don't have time
>>>>> to look at this until after that. Do you mind if we move the
>>>>> discussion over to that Jira ticket I opened though?
>>>>>
>>>>> Niall
>>>>>
>>>>>> Clebert Suconic
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>>
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 


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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Niall Pemberton <ni...@gmail.com>.
On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>  > Yes it does (thru' AbstractConveter which it extends) - I can remove
>  > that reference completely by just making the getDefaultType() method
>  > abstract and having each implementation implement it.
>  >
>
> Just an idea... You could just have the Abstract class holding a
> WeakReference and then:
>
> WeakReference clazz;
>
> public void setClazz(Class clazz)
> {
>    this.clazz = new WeakReference(clazz);
> }
>
> public Class getClazz()
> {
>     return (Class) clazz.get();
> }

Yes, but that reference can be garbage collected - so would have to
handle that as well. In this instance each AbstractConverter
implementation only ever returns the same value - so I think its
simpler to remove the class reference - for example in
IntegerConverter it would just have:

    protected Class getDefaultType() {
        return Integer.class;
    }

Niall

> Niall Pemberton wrote:
> > Woops, should have gone to dev@ list
> >
> > ---------- Forwarded message ----------
> > From: Niall Pemberton <ni...@gmail.com>
> > Date: Aug 7, 2007 2:36 AM
> > Subject: Re: Circular Reference on WeakHashMap
> > To: Clebert Suconic <cs...@redhat.com>
> >
> >
> > On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
> >> The solution seems simpler than I thought though...
> >>
> >> After looking at the report again...
> >> org.apache.commons.beanutils.converters.ClassConverter@22616909
> >>
> >> ClassConverter  probably has a reference to Class... I thought this was
> >> a reflection object.
> >>
> >> It should be WeakReference<Class>.
> >
> > Yes it does (thru' AbstractConveter which it extends) - I can remove
> > that reference completely by just making the getDefaultType() method
> > abstract and having each implementation implement it.
> >
> >> And... inspect your code for any other reflection usages.
> >
> > OK when I get back I was going to have a play with JVMTIInterface - looks good.
> >
> > Niall
> >
> >> Niall Pemberton wrote:
> >>> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
> >>>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
> >>>> investigation on this:
> >>>>
> >>>> http://jira.jboss.com/jira/browse/JBAS-2299
> >>> Thanks for getting back to us so quickly.
> >>>
> >>>> (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)
> >>> OK I will.
> >>>
> >>>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
> >>> seems to be somewhat messed up in posting here - so I've (hopefully)
> >>> cleaned it up and re-posted in a Jira ticket I've opened for this
> >>> here:
> >>>
> >>> https://issues.apache.org/jira/browse/BEANUTILS-291
> >>>
> >>>> 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.
> >>> Preach away - I have no great knowledge of this stuff.
> >>>
> >>>> 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.
> >>> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
> >>> September) - so unless someone else picks this up - ii don't have time
> >>> to look at this until after that. Do you mind if we move the
> >>> discussion over to that Jira ticket I opened though?
> >>>
> >>> Niall
> >>>
> >>>> Clebert Suconic
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> > For additional commands, e-mail: dev-help@commons.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

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


Re: Fwd: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
 > Yes it does (thru' AbstractConveter which it extends) - I can remove
 > that reference completely by just making the getDefaultType() method
 > abstract and having each implementation implement it.
 >

Just an idea... You could just have the Abstract class holding a 
WeakReference and then:

WeakReference clazz;

public void setClazz(Class clazz)
{
   this.clazz = new WeakReference(clazz);
}

public Class getClazz()
{
    return (Class) clazz.get();
}

Niall Pemberton wrote:
> Woops, should have gone to dev@ list
> 
> ---------- Forwarded message ----------
> From: Niall Pemberton <ni...@gmail.com>
> Date: Aug 7, 2007 2:36 AM
> Subject: Re: Circular Reference on WeakHashMap
> To: Clebert Suconic <cs...@redhat.com>
> 
> 
> On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
>> The solution seems simpler than I thought though...
>>
>> After looking at the report again...
>> org.apache.commons.beanutils.converters.ClassConverter@22616909
>>
>> ClassConverter  probably has a reference to Class... I thought this was
>> a reflection object.
>>
>> It should be WeakReference<Class>.
> 
> Yes it does (thru' AbstractConveter which it extends) - I can remove
> that reference completely by just making the getDefaultType() method
> abstract and having each implementation implement it.
> 
>> And... inspect your code for any other reflection usages.
> 
> OK when I get back I was going to have a play with JVMTIInterface - looks good.
> 
> Niall
> 
>> Niall Pemberton wrote:
>>> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
>>>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
>>>> investigation on this:
>>>>
>>>> http://jira.jboss.com/jira/browse/JBAS-2299
>>> Thanks for getting back to us so quickly.
>>>
>>>> (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)
>>> OK I will.
>>>
>>>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
>>> seems to be somewhat messed up in posting here - so I've (hopefully)
>>> cleaned it up and re-posted in a Jira ticket I've opened for this
>>> here:
>>>
>>> https://issues.apache.org/jira/browse/BEANUTILS-291
>>>
>>>> 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.
>>> Preach away - I have no great knowledge of this stuff.
>>>
>>>> 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.
>>> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
>>> September) - so unless someone else picks this up - ii don't have time
>>> to look at this until after that. Do you mind if we move the
>>> discussion over to that Jira ticket I opened though?
>>>
>>> Niall
>>>
>>>> Clebert Suconic
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 


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


Fwd: Circular Reference on WeakHashMap

Posted by Niall Pemberton <ni...@gmail.com>.
Woops, should have gone to dev@ list

---------- Forwarded message ----------
From: Niall Pemberton <ni...@gmail.com>
Date: Aug 7, 2007 2:36 AM
Subject: Re: Circular Reference on WeakHashMap
To: Clebert Suconic <cs...@redhat.com>


On 8/7/07, Clebert Suconic <cs...@redhat.com> wrote:
> The solution seems simpler than I thought though...
>
> After looking at the report again...
> org.apache.commons.beanutils.converters.ClassConverter@22616909
>
> ClassConverter  probably has a reference to Class... I thought this was
> a reflection object.
>
> It should be WeakReference<Class>.

Yes it does (thru' AbstractConveter which it extends) - I can remove
that reference completely by just making the getDefaultType() method
abstract and having each implementation implement it.

> And... inspect your code for any other reflection usages.

OK when I get back I was going to have a play with JVMTIInterface - looks good.

Niall

> Niall Pemberton wrote:
> > On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
> >> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
> >> investigation on this:
> >>
> >> http://jira.jboss.com/jira/browse/JBAS-2299
> >
> > Thanks for getting back to us so quickly.
> >
> >> (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)
> >
> > OK I will.
> >
> >> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
> > seems to be somewhat messed up in posting here - so I've (hopefully)
> > cleaned it up and re-posted in a Jira ticket I've opened for this
> > here:
> >
> > https://issues.apache.org/jira/browse/BEANUTILS-291
> >
> >> 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.
> >
> > Preach away - I have no great knowledge of this stuff.
> >
> >> 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.
> >
> > Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
> > September) - so unless someone else picks this up - ii don't have time
> > to look at this until after that. Do you mind if we move the
> > discussion over to that Jira ticket I opened though?
> >
> > Niall
> >
> >> Clebert Suconic
>
>

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


Re: Circular Reference on WeakHashMap

Posted by Clebert Suconic <cs...@redhat.com>.
The solution seems simpler than I thought though...

After looking at the report again...
org.apache.commons.beanutils.converters.ClassConverter@22616909

ClassConverter  probably has a reference to Class... I thought this was 
a reflection object.

It should be WeakReference<Class>.


And... inspect your code for any other reflection usages.


Niall Pemberton wrote:
> On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
>> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
>> investigation on this:
>>
>> http://jira.jboss.com/jira/browse/JBAS-2299
> 
> Thanks for getting back to us so quickly.
> 
>> (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)
> 
> OK I will.
> 
>> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
> seems to be somewhat messed up in posting here - so I've (hopefully)
> cleaned it up and re-posted in a Jira ticket I've opened for this
> here:
> 
> https://issues.apache.org/jira/browse/BEANUTILS-291
> 
>> 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.
> 
> Preach away - I have no great knowledge of this stuff.
> 
>> 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.
> 
> Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
> September) - so unless someone else picks this up - ii don't have time
> to look at this until after that. Do you mind if we move the
> discussion over to that Jira ticket I opened though?
> 
> Niall
> 
>> Clebert Suconic


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


Re: Circular Reference on WeakHashMap

Posted by Niall Pemberton <ni...@gmail.com>.
On 8/6/07, Clebert Suconic <cs...@redhat.com> wrote:
> I have been investigating WeakHashMaps on BeanUtils 1.8 as part of a
> investigation on this:
>
> http://jira.jboss.com/jira/browse/JBAS-2299

Thanks for getting back to us so quickly.

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

OK I will.

> 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'm not familiar with JBoss's JVMTIInterface or its output - and it
seems to be somewhat messed up in posting here - so I've (hopefully)
cleaned it up and re-posted in a Jira ticket I've opened for this
here:

https://issues.apache.org/jira/browse/BEANUTILS-291

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

Preach away - I have no great knowledge of this stuff.

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

Unfortunately I'm away on holiday soon for 3 weeks (12th August to 2nd
September) - so unless someone else picks this up - ii don't have time
to look at this until after that. Do you mind if we move the
discussion over to that Jira ticket I opened though?

Niall

> Clebert Suconic

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