RFR 9: JDK-8146028 : Common Cleaner for finalization replacements in java.base
Peter Levart
peter.levart at gmail.com
Wed Jan 6 19:02:32 UTC 2016
On 01/05/2016 10:16 PM, 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
Hi Roger,
I briefly skimmed over the webrev, and found the following issue in
ProcessImpl:
420 // Register a cleaning function to close the handle
421 CleanerFactory.getCleaner().register(this, () ->
closeHandle(handle));
422
... 'handle' is an instance variable, which means that 'this' is
captured by the lambda. You will have to assign handle to a local var
and capture it instead to prevent 'this' to be captured.
Regards, Peter
>
> 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