<p>It sounds like delay_finalization() in your link serves the same purpose as GC.KeepAlive(this) in the CLR.† As you point out in that paper, artificially extending the lifetime of the this reference would be costly on architectures with a small register set.† In addition, under heavy load where this race is more likely to occur you also risk an OOM if the object graph of "this" is very large.† I'm not sure how often this race is actually a problem in practice (people are usually encouraged to not impl a finalized or if they do, keep it dead simple), so perhaps a developer hint (ala delay_finalization/GC.KeepAlive) is a decent compromise.</p>

<p>As for mem ordering/visibility, are you suggesting that there should always be a membar before the finalizer picks up the reference to process? Might get kind of expensive on many core (especially NUMA) machines and if, e.g., multiple finalizer threads are ever used.† If multiple finalizer threads are used, I don't see why you'd want them to synchronize with GC as presumably they could run concurrently with either GC threads or even mutators.† If we're saying that ease of use/correctness is more important than performance for finalization processing, then it makes sense.† It's a tricky problem as ultimately you'll find competing use cases (perf vs ease of use).</p>

<p>Cheers</p>
<p>Sent from my phone</p>
<div class="gmail_quote">On May 14, 2012 8:01 PM, "Boehm, Hans" <<a href="mailto:hans.boehm@hp.com" target="_blank">hans.boehm@hp.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">







<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">In my view, the hard problem is finalization while a method is running.† Fixing that the obvious way has a probably small, but nonzero optimization cost.† (Essentially
 no dead variable elimination on reference variables.† Guesses among the optimization experts in the C++ committee were around a 1% slowdown to support a semi-esoteric feature.† I donít know of any real measurements.)† We came up with some compromises in a
 C++ context in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2261.html" target="_blank">
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2261.html</a> .<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u>†<u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I think the other issues could be solved fairly easily. †In my view Modula 3 adequately solved the ordering issue by insisting on ordered finalization, which
 is essentially what you now get out of java.lang.ref, though in a less direct way.† As far as I know, Modula-3 users generally agreed with that assessment, but Java and C# designers did not, and came up with what I consider to be a much worse point in the
 design space, at least for finalization itself.† I also donít see why, given a solution to the early finalization problem, it would be difficult to ensure that the last object access happens before finalization.† Standard garbage collectors probably have each
 thread stop operation synchronize with finalization anyway.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u>†<u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hans<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u>†<u></u></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Vitaly Davidovich [mailto:<a href="mailto:vitalyd@gmail.com" target="_blank">vitalyd@gmail.com</a>]
<br>
<b>Sent:</b> Monday, May 14, 2012 3:05 PM<br>
<b>To:</b> Boehm, Hans<br>
<b>Cc:</b> <a href="mailto:concurrency-interest@cs.oswego.edu" target="_blank">concurrency-interest@cs.oswego.edu</a>; Bob Lee; <a href="mailto:dholmes@ieee.org" target="_blank">dholmes@ieee.org</a><br>
<b>Subject:</b> Re: [concurrency-interest] Object finalization<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><u></u>†<u></u></p>
<p>Raymond Chen (MSFT) has an interesting series of posts on finalization, including this one which demonstrates your example Hans:
<a href="http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/10049634.aspx" target="_blank">http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/10049634.aspx</a><u></u><u></u></p>
<p>CLR team even added GC.KeepAlive() to try and alleviate some causes of this race.† Then there's a whole slew of bugs that can happen due to memory write ordering/visibility since finalizer thread is subject to same issues as normal threads.† Then in CLR
 finalizer can run even if constructor fails (I believe JVM does not?), possibly causing broken state/invariants to be observed.† Finalizers are one of those well intentioned ideas that goes haywire ... :)<u></u><u></u></p>


<p>Sent from my phone<u></u><u></u></p>
<div>
<p class="MsoNormal">On May 14, 2012 4:58 PM, "Boehm, Hans" <<a href="mailto:hans.boehm@hp.com" target="_blank">hans.boehm@hp.com</a>> wrote:<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">But things are considerably worse than that.† References only solve the easy problem.† The most serious
 problem in my mind is that finalizers can run, and references can be enqueued, while e.g. a method of the object being finalized is still running.† The fact that the method is still running does not ensure that the object itself is still reachable; the method
 may only need fields that have already been cached in registers to complete.† This affects finalizers and java.lang.ref equally, and explains why probably the large majority of code using either one is broken.</span><u></u><u></u></p>


<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">†</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">I gave a JavaOne talk about this many years ago (slides at
<a href="http://www.hpl.hp.com/personal/Hans_Boehm/misc_slides/java_finalizers.pdf" target="_blank">
http://www.hpl.hp.com/personal/Hans_Boehm/misc_slides/java_finalizers.pdf</a>).† It is possible, though really ugly and slow to work around the problem.† I donít believe anyone does.† I was told just after I gave the talk that this explained a problem somebody
 had been trying to track down, so I suspect this actually happens occasionally in the wild, though probably not on x86-32.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">†</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hans</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">†</span><u></u><u></u></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:concurrency-interest-bounces@cs.oswego.edu" target="_blank">concurrency-interest-bounces@cs.oswego.edu</a> [mailto:<a href="mailto:concurrency-interest-bounces@cs.oswego.edu" target="_blank">concurrency-interest-bounces@cs.oswego.edu</a>]
<b>On Behalf Of </b>Bob Lee<br>
<b>Sent:</b> Monday, May 14, 2012 11:01 AM<br>
<b>To:</b> <a href="mailto:dholmes@ieee.org" target="_blank">dholmes@ieee.org</a><br>
<b>Cc:</b> <a href="mailto:concurrency-interest@cs.oswego.edu" target="_blank">concurrency-interest@cs.oswego.edu</a><br>
<b>Subject:</b> Re: [concurrency-interest] Object finalization</span><u></u><u></u></p>
</div>
</div>
<p class="MsoNormal">†<u></u><u></u></p>
<p class="MsoNormal">On Sun, May 13, 2012 at 11:22 PM, David Holmes <<a href="mailto:davidcholmes@aapt.net.au" target="_blank">davidcholmes@aapt.net.au</a>> wrote:<u></u><u></u></p>
<div>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial","sans-serif";color:blue">I should add the Vitaly's comments prompted me to remember that 'a' and 'b' might refer to objects that themselves have
 been finalized prior to the current finalizer running. This just reinforces how tricky finalization is.</span><u></u><u></u></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal">†<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Indeed, the finalizers can run in any order, independent of the structure of the object graph.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">†<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">For those who are interested in learning more, I cover that and half a dozen other reasons not to use finalizers in this talk:†<a href="http://www.parleys.com/#id=2657&st=5" target="_blank">http://www.parleys.com/#id=2657&st=5</a><u></u><u></u></p>


</div>
<div>
<p class="MsoNormal">†<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Bob†<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><a href="https://squareup.com/jobs" target="_blank">Square is hiring!</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">†<u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><u></u><u></u></p>
</div>
</div>
</div>
</div>

</blockquote></div>