Put it another way: does a static reference from a class to itself prevent
that class from being garbage collected? Of course not. ClassValue is
intended to be a way to inject pseudo-static data into either a class or a
Class. Injecting that data, even if it has a reference back to the class,
should not prevent the class from being collected.

On Fri, Mar 2, 2018 at 2:19 PM Charles Oliver Nutter <head...@headius.com>
wrote:

> I have posted a modified version of my description to the main bug report.
>
> TLDR: ClassValue should not root objects.
>
> - Charlie
>
> On Fri, Mar 2, 2018 at 2:13 PM Charles Oliver Nutter <head...@headius.com>
> wrote:
>
>> Yes, it may be the same bug.
>>
>> In my case, the ClassValue is held by a utility object used for our Java
>> integration. That utility object has to live somewhere, so it's held by the
>> JRuby runtime instance. There's a strong reference chain leading to the
>> ClassValue.
>>
>> The value is a Ruby representation of the class, with reflected methods
>> parsed out and turned into Ruby endpoints. Obviously, the value also
>> references the class, either directly or indirectly through reflected
>> members.
>>
>> The Ruby class wrapper is only hard referenced directly if there's an
>> instance of the object live and moving through JRuby. It may be referenced
>> indirectly through inline caches.
>>
>> However...I do not believe this should prevent collection of the class
>> associated with the ClassValue.
>>
>> The value referenced in the ClassValue should not constitute a hard
>> reference. If it is alive *only* because of its associate with a given
>> class, that should not be enough to root either the object or the class.
>>
>> ClassValue should work like ThreadLocal. If the Thread associated with a
>> value goes away, the value reference goes away. ThreadLocal does nothing
>> prevent it from being collected. If the Class associated with a Value goes
>> away, the same should happen to that Value and it should be collectable
>> once all other hard references are gone.
>>
>> Perhaps I've misunderstood?
>>
>> - Charlie
>>
>> On Fri, Mar 2, 2018 at 12:16 PM Vladimir Ivanov <
>> vladimir.x.iva...@oracle.com> wrote:
>>
>>> Charlie,
>>>
>>> Does it look similar to the following bugs?
>>>    https://bugs.openjdk.java.net/browse/JDK-8136353
>>>    https://bugs.openjdk.java.net/browse/JDK-8169425
>>>
>>> If that's the same (and it seems so to me [1]), then speak up and
>>> persuade Paul it's an important edge case (as stated in JDK-8169425).
>>>
>>> Best regards,
>>> Vladimir Ivanov
>>>
>>> [1] new RubyClass(Ruby.this) in
>>>
>>>      public static class Ruby {
>>>          private ClassValue<RubyClass> cache = new
>>> ClassValue<RubyClass>() {
>>>              protected RubyClass computeValue(Class<?> type) {
>>>                  return new RubyClass(Ruby.this);
>>>              }
>>>          };
>>>
>>> On 3/1/18 2:25 AM, Charles Oliver Nutter wrote:
>>> > So I don't think we ever closed the loop here. Did anyone on the JDK
>>> > side confirm this, file an issue, or fix it?
>>> >
>>> > We still have ClassValue disabled in JRuby because of the rooting
>>> issues
>>> > described here and in https://github.com/jruby/jruby/pull/3228.
>>> >
>>> > - Charlie
>>> >
>>> > On Thu, Aug 27, 2015 at 7:04 AM Jochen Theodorou <blackd...@gmx.org
>>> > <mailto:blackd...@gmx.org>> wrote:
>>> >
>>> >     One more thing...
>>> >
>>> >     Remi, I tried your link with my simplified scenario and it does
>>> there
>>> >     not stop the collection of the classloader
>>> >
>>> >     Am 27.08.2015 11:54, schrieb Jochen Theodorou:
>>> >      > Hi,
>>> >      >
>>> >      > In trying to reproduce the problem outside of Groovy I stumbled
>>> >     over a
>>> >      > case case which I think should work
>>> >      >
>>> >      > public class MyClassValue extends ClassValue {
>>> >      >      protected Object computeValue(Class type) {
>>> >      >          Dummy ret = new Dummy();
>>> >      >          Dummy.l.add (this);
>>> >      >          return ret;
>>> >      >      }
>>> >      > }
>>> >      >
>>> >      >   class Dummy {
>>> >      >       static final ArrayList l = new ArrayList();
>>> >      >   }
>>> >      >
>>> >      > basically this means there will be a hard reference on the
>>> ClassValue
>>> >      > somewhere. It can be in a static or non-static field, direct or
>>> >      > indirect. But this won't collect. If I put for example a
>>> >     WeakReference
>>> >      > in between it works again.
>>> >      >
>>> >      > Finally I also tested to put the hard reference in a third class
>>> >      > instead, to avoid this self reference. But it can still not
>>> collect.
>>> >      >
>>> >      > So I currently have the impression that if anything holds a hard
>>> >      > reference on the class value that the classloader cannot be
>>> collected
>>> >      > anymore.
>>> >      >
>>> >      > Unless I misunderstand something here I see that as a bug
>>> >      >
>>> >      > bye blackdrag
>>> >      >
>>> >
>>> >
>>> >     --
>>> >     Jochen "blackdrag" Theodorou
>>> >     blog: http://blackdragsview.blogspot.com/
>>> >
>>> >     _______________________________________________
>>> >     mlvm-dev mailing list
>>> >     mlvm-dev@openjdk.java.net <mailto:mlvm-dev@openjdk.java.net>
>>> >     http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>>> >
>>> > --
>>> >
>>> > - Charlie (mobile)
>>> >
>>> >
>>> >
>>> > _______________________________________________
>>> > mlvm-dev mailing list
>>> > mlvm-dev@openjdk.java.net
>>> > http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>>> >
>>>
>> --
>>
>> - Charlie (mobile)
>>
> --
>
> - Charlie (mobile)
>
-- 

- Charlie (mobile)
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to