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)