Can an object be finalized while still weakly reachable?
Xueming Shen
xueming.shen at oracle.com
Tue May 17 15:15:49 UTC 2016
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.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