Why is finalize wrong?

Peter Levart peter.levart at gmail.com
Wed Sep 3 13:05:52 UTC 2014

On 09/03/2014 02:56 PM, David M. Lloyd wrote:
> On 09/03/2014 06:48 AM, Stanimir Simeonoff wrote:
>> Hi Andrew,
>> On Wed, Sep 3, 2014 at 12:58 PM, Andrew Haley <aph at redhat.com> wrote:
>>> On 03/09/14 01:15, Stanimir Simeonoff wrote:
>>>> Like David Lloyd mentioned finalize() can be invoked concurrently to
>>>> some methods (if there is no reachability to 'this'). OTOH I see
>>>> finalize useful for managing native resources mostly and possibly
>>>> stopping (signaling) threads left unmanaged. In that particular case
>>>> synchronization is a must, so it comes naturally.
>>> But finalize isn't useful for managing native resources because
>>> finalizers may or may not run, as you note.  People will test their
>>> programs with one implementation then discover, when their programs
>>> are deployed, that they sometimes mysteriously fail.  In particular,
>>> you might run out of file handles.
>>> I meant cleaning up rather than managing per se. To make it clear:
>> finalization is no substitute for proper lifecycle - anything that has
>> open() should have a following up close(), otherwise it's a bug.
>> Finalization still helps as safenet vs leaving native resources totally
>> unallocated and leaking. Yet, finalizers have to run somehow since the
>> direct (and mapped) buffers very heavily rely on them. The direct/mapped
>> buffers are ones that don't have proper lifecycle, esp. the mapped ones
>> The latter don't offer munmap.
> This is why everyone pools buffers.  The following code:
>> static void reserveMemory(long size, int cap) {
>> //check if above the direct memory threashold and...
>>          System.gc();
>>          try {
>>              Thread.sleep(100);
>>          } catch (InterruptedException x) {
>>              // Restore interrupt status
>>              Thread.currentThread().interrupt();
>>          }
>> }
> is basically crap, and the first thing any serious NIO developer will 
> do is defeat it with buffer pooling.

I think I should backport the fix for it to 8u...

Regards, Peter

More information about the core-libs-dev mailing list