Can an object be finalized while still weakly reachable?

Martin Buchholz martinrb at google.com
Tue May 17 07:55:19 UTC 2016


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.levart at 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
>



More information about the core-libs-dev mailing list