Sherman, Thank you very much for pointing me at that old thread. I was indeed going down the same path and stumbling over the same obstacles! I still think we can do better, but it's definitely not easy.
On Tue, May 17, 2016 at 8:15 AM, Xueming Shen <xueming.s...@oracle.com> wrote: > On 5/17/16 12:55 AM, Martin Buchholz wrote: >> >> Thanks, Peter. >> >> My current theory is indeed that I made a mistake, and have >> encountered my first real finalization resurrection bug. >> ZipFile + Inflater have 4 finalize methods and a WeakHashMap in play! > > there was a long discussion when we touched that part of the code last time. > just > for your reference:-) > > http://mail.openjdk.java.net/pipermail/core-libs-dev/2011-April/thread.html#6545 > > -sherman > >> My static reference was finalized because it used to be unreachable, >> not because it is now weakly reachable! >> >> On Mon, May 16, 2016 at 11:49 PM, Peter Levart <peter.lev...@gmail.com> >> wrote: >>> >>> Hi Martin, >>> >>> >>> >>> On 05/17/2016 05:19 AM, Martin Buchholz wrote: >>>> >>>> I have some evidence that an object's finalize method can run while a >>>> weak reference pointing to it is not yet cleared, which surprised me. >>>> >>>> E.g. >>>> class F { protected void finalize() { assert wref.get() != this; } } >>>> static WeakReference wref = new WeakReference(new F()); >>>> >>>> If this is a bug, I can try to give y'all a repro recipe. >>>> If not, we should fix the docs >>>> """When the weak references to a weakly-reachable object are cleared, >>>> the object becomes eligible for finalization.""" >>>> >>>> (It's also quite possible I made a mistake diagnosing this) >>> >>> >>> What can happen with above code is that you get a NPE from dereferencing >>> wref in finlailze(). In case NPE is not thrown and the program constructs >>> only a single instance of F then assert should succeed. >>> >>> It is possible that you made a mistake. Can you post the real code? >>> >>> Regards, Peter >>> >