RFR 9: JDK-8146028 : Common Cleaner for finalization replacements in java.base
Daniel Fuchs
daniel.fuchs at oracle.com
Wed Jan 6 14:52:18 UTC 2016
Hi Roger,
I was wondering whether URLJarFile::finalize could be simply removed.
The change you are proposing looks strange to me: if this method
remains, then either the method should continue to call close() or
it should call super.finalize(), shouldn't it?
Since this is a sun.net class then maybe simply removing it would
be the safest thing...
best regards,
-- daniel
On 05/01/16 22:16, Roger Riggs wrote:
> Hi Daniel,
>
> webrev updated to revert changes to MeteredStream as too risky.
>
> http://cr.openjdk.java.net/~rriggs/webrev-cleaning-finalizers/index.html
>
> On 1/5/2016 1:45 PM, Daniel Fuchs wrote:
>> Hi Roger,
>>
>> Some early feedback:
>>
>> I see that prior to your changes, MeteredStream.close() would
>> be called by finalize.
>> This will no longer be the case after
>> http://cr.openjdk.java.net/~rriggs/webrev-cleaning-finalizers/index.html
> In the case where finalize would call close(), there can be no
> queuedForCleanup activity
> because there can be no strong reference from the KeepAliveStreamCleaner
> thread
> or the queue that holds the pending cleanups.
> It cannot be in the Cache of connections being kept alive or the thread
> that keeps them alive.
>
> It might be possible that the underlying connection is still open; but
> there is no advantage
> of trying to drain it. There is the possibility of resurrecting it by
> virtue of deciding that
> it should be queued for cleanup and starting a new thread to do the cleanup.
>
> All in all, there is a risk of misunderstanding the dynamic behavior and
> it would be safer
> to leave this using finalize.
>
>>
>> I see that MeteredStream has a subclass (KeepAliveStream) that
>> overrides close() - so KeepAliveStream probably requires a cleanup
>> as well - doesn't it?
>>
>> Finally I'd suggest making the variable 'pi' final - since you're
>> passing that to the lambda you don't want to allow its value to
>> be modified afterwards (fortunately it's not - and I believe it
>> should be good to ensure it won't be).
> ok, it would not go unnoticed, the compiler should complain if the
> variable is no effectively final.
>
> Thanks, Roger
>
>>
>> I haven't looked at the other classes yet...
>>
>> best regards,
>>
>> -- daniel
>>
>> On 05/01/16 19:24, Roger Riggs wrote:
>>> The follow on work to adding the Cleaner is to replace uses of
>>> finalization with uses of the Cleaner.
>>> For the 'easy' cases in the java.base module, it is useful to introduce
>>> a private Cleaner for the
>>> java.base module. It is proposed to be held weakly, to allow it to
>>> terminate on a lightly loaded
>>> system.
>>>
>>> Webrev for Review:
>>> http://cr.openjdk.java.net/~rriggs/webrev-cleaning-factory-8146028/
>>>
>>>
>>> The 2nd step is using the Cleaner.
>>> - Empty finalize methods should (I think) be removed; but since they
>>> are part of the public spec
>>> the process needs two full releases; so the proposal is to deprecate
>>> them first.
>>> (The JEP 277 necessary changes will be updated when JEP 277
>>> semantics are finalized)
>>>
>>> - In a few cases, the code in the finalizer is redundant and if removed
>>> would allow
>>> an optimization of the handling of the finalizer and future removal
>>> of the finalize method.
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~rriggs/webrev-cleaning-finalizers/index.html
>>>
>>> Thanks for comments and suggestions, Roger
>>>
>>>
>>>
>>>
>>
>
More information about the core-libs-dev
mailing list