some thoughts on ClassValue
Peter Levart
peter.levart at gmail.com
Sat Apr 27 15:31:49 PDT 2013
On 04/27/2013 11:54 PM, John Rose wrote:
> On Apr 27, 2013, at 2:34 PM, Jochen Theodorou <blackdrag at gmx.org
> <mailto:blackdrag at gmx.org>> wrote:
>
>> Am 27.04.2013 23:26, schrieb John Rose:
>> ...
>>> Each instance of the Groovy runtime will use a distinct ClassValue
>>> instance.
>>>
>>> If the ClassValue instance goes dead, then all the values (for each
>>> class) bound using that instance should go dead also.
>>>
>>> If they don't it's a bug.
>>
>> well... I assume that if I have a ClassValue for Object that is an
>> isntance of Foo, that this instance will stay as long as I don't delete
>> it myself. That is how ClassValue works, or not? And that is exactly my
>> problem too.
>
> As a simple example: Make a ClassValue object, bind a 1Mb array to
> Object.class using it, and then throw it all away. (Except
> Object.class, naturally.) Even if you do this in a loop, you should
> not get a storage leak.
>
> (A class value bound to a class is live only if both the Class and the
> ClassValue instance are both live.)
>
> Often people bind ClassValue instances to "static final" variables.
> If the class containing the static variable goes away, then the
> ClassValue goes away, and anything bound (to whatever class, including
> Object) should go away. That's nice, at least in theory.
>
> Things get tricky (this probably happens in practice) when there is a
> loop:
>
> class MyRuntimeInMyClassLoader { static final MyClassValue MYCV =
> ... } => instance of MYCV
> instance of MYCV x Object.class (say) => instance of MyMetaStuff
> instance of MyMetaStuff => MyRuntimeInMyClassLoader.class
>
> Although I am not one of the 12 people on the planet who fully
> understand class loader interactions with GC, I suspect this loop
> might be "sticky", and might have to be broken by (say) a
> SoftReference. (You can use a SoftReference if you are willing to
> have the GC break references not recently used, which you can
> reconstruct if needed.)
>
> --- John
Hello John, Jochen, sorry to interrupt,
So to break a loop, you propose the following structure if I understand
correctly?
class MyRuntimeInMyClassLoader {
static final ClassValue<SoftReference<MyMetaStuff>> MYCV = new
ClassValue<>() {...};
Wouldn't then MyRuntimeInMyClassLoader class be softly reachable (via
softly reachable MyMetaStuff) and might not go away so quickly until
there is memory pressure and consequently the MYCV ClassValue too?
Regards, Peter
>
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20130428/d7d284bf/attachment-0001.html
More information about the mlvm-dev
mailing list