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! 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 >