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)
_______________________________________________ mlvm-dev mailing list mlvm-dev@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev