Hi. I'd like to thank everyone in participating in our discussion about lightweight finalization and shaping and sharping my understanding of the problem. I believe the discussion has now slowed down and it is time for another summary. I have added one into the issue (while also changing its subject):
https://bugs.openjdk.java.net/browse/JDK-8051843?focusedCommentId=13539596&p age=com.atlassian.jira.plugin.system.issuetabpanels:comment- tabpanel#comment-13539596[1] I believe our understanding of the problem has been deepen enough to focus on creation of the actual public API for lightweight finalization. It will be my task for up- coming week to start necessary steps to propose such API. -jt PS: I'd like to especially thank to Andrew for pointing out the "this" reference problem and Doug for commenting it. I've reported https://bugs.openjdk.java.net/browse/JDK-8055183[2] to resolve it somehow. I'll be watching from distance eager to know the result. Dne St 13. srpna 2014 13:12:43, Jaroslav Tulach napsal(a): > Dne So 9. srpna 2014 07:18:54, Doug Lea napsal(a): > > > Dne Pá 8. srpna 2014 15:02:41, Stanimir Simeonoff napsal(a): > > > > > > > > > According to articles provided by Andrew[1], toString() can be on stack, > > > even if obj > > > (e.g. this for toString()) is garbage collected. This is a bit > > > surprising > > > (an OOP fan > > > would expect that this is GC root while its instance method is running), > > > but such > > > behavior is said to be in accordance to the 1.8 spec. > > > > > > Question for Doug (as a member of jmm-dev list) then is: would not it be > > > wise to > > > change the spec to require this to be GC root while its instance method > > > is > > > being > > > executed? > > > > Possible changes are being discussed. It is not clear yet > > exactly what rules would better match people's expectations > > while remaining implementable by JVMs, and/or whether they > > would force performance degradations even > > for the vast majority of code not using finalizers. It is > > very possible the end result will just be to clarify rules and > > provide mechanisms allowing better programmer control. > > > > Any changes would go into effect for JDK9 at the earliest, > > so if you can find a way to avoid use of finalizers > > here, it would be a better option. > > I'll do my best to come up with a lightweight alternative to finalization. > However: > > As far as I understand Andrew's inquiry, the problem is not (that much) > related to finalizers, rather to question whether following method can ever > finish or not: > > private void gcThis() { > Reference<?> ref = new WeakReference<>(this); > while (ref.get() != null) { > System.gc(); > } > System.err.println("ref is gone: " + ref); > } > > On Oracle's JDK8 the method has never finished for me. However when I tried > IBM's JDK (identification can be found below) the method finished every > time! A bit of consistency would be beneficial in this area, imho. > > -jt > > PS: While I understand why the two JDKs behave the way they behave, I don't > think this is explainable to regular Java developers. But maybe they don't > care that much and one day it will be easy to google out solution on > stackoverflow to prevent "this" being garbage collected by changing the last > method line to > > System.err.println("ref is gone: " + ref + " for " + this); > > The version of IBM's Java was: > > ~/bin/ibmjava7$ ./bin/java -version > java version "1.7.0" > Java(TM) SE Runtime Environment (build pxa6470_27sr1fp1-20140708_01(SR1 > FP1)) IBM J9 VM (build 2.7, JRE 1.7.0 Linux amd64-64 Compressed References > 20140707_205525 (JIT enabled, AOT enabled) > J9VM - R27_Java727_SR1_20140707_1408_B205525 > JIT - tr.r13.java_20140410_61421.07 > GC - R27_Java727_SR1_20140707_1408_B205525_CMPRSS > J9CL - 20140707_205525) > JCL - 20140707_01 based on Oracle 7u65-b16 -------- [1] https://bugs.openjdk.java.net/browse/JDK-8051843?focusedCommentId=13539596&p age=com.atlassian.jira.plugin.system.issuetabpanels:comment- tabpanel#comment-13539596 [2] https://bugs.openjdk.java.net/browse/JDK-8055183