On Jun 8, 2015, at 4:20 PM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
> 
> 
> On 06/08/2015 09:47 PM, Kim Barrett wrote:
>> On Jun 6, 2015, at 11:02 AM, Peter Levart <peter.lev...@gmail.com>
>>  wrote:
>> 
>>> I understand that it would be desirable for a finalizable object to be made 
>>> "untracked" as soon as it is manually cleaned-up. This would most certainly 
>>> give a relief to GC as it could reclaim such untracked objects immediately 
>>> like normal objects without pushing them through all the finalization steps.
>>> 
>>> Such feature would need new API. Here's my take on such API incorporated in 
>>> my prototype. This feature is mostly independent of other changes in the 
>>> prototype and could be provided stand-alone. I choose to incorporate it 
>>> into the prototype to compare it's overhead with classical finalization in 
>>> unchanged and changed JDKs:
>>> 
>>>     
>>> http://cr.openjdk.java.net/~plevart/misc/JEP132/ReferenceHandling/webrev.03/
>> While changes are needed to do this sort of thing, it seems to me a better 
>> change would be to not use finalize() at all, 
> 
> You mean FinalReference, right?

FinalReference is an implementation detail used in the implementation of 
finalize().  So yes, I mean FinalReference, but applications have no direct 
access to them.

> This is the only remaining Reference type that isn't cleared automatically by 
> GC.

PhantomReference is also not automatically cleared, but see JDK-8071507.

> So if a XxxReference is cleared when it is discovered with referent being 
> xxx-ly-reachable and later enqueued by ReferenceHandler thread, then GC has 
> less work with it? Why is automatically cleared Reference more lightweight 
> than FinalReference? Because GC can reclaim such referent right away in the 
> same GC cycle as hooking it on the pending list?

That’s one reason, and is part of the rationale for making the change suggested 
for JDK-8071507.

Another benefit for PhantomReference is that the code that creates the 
reference object can also record it for later clearing, such as by a close-like 
operation.  If the reference is cleared by the application then it never gets 
added to the pending list at all.

> 
>> but instead use PhantomReference-based cleanup. It provides exactly that 
>> kind of behavior, and has other benefits besides.
>> 
>> There is some discussion about doing exactly that for 
>> File{Input,Output}Stream (see 
>> https://bugs.openjdk.java.net/browse/JDK-8080225
>> ).
>> 
>> 
> 
> sun.misc.Cleaner is already such thing (a PhantomReference). Would it be of 
> interest to have a public API similar to sun.misc.Cleaner, but with the 
> following difference:
> 
> - public "Cleaners" would be executed by same thread(s) as finalize() 
> methods. This would detach their execution from ReferenceHandler thread which 
> must dispatch all references and must not be disturbed by user code.

There’s been some discussion of a Cleaner-like API for ordinary 
PhantomReference objects, along with some prototyping.  Having a utility that 
packages up some of the boilerplate involved in using PhantomReference might 
help transition away from finalize().


Reply via email to