[OpenJDK 2D-Dev] RFR: 8175984 : ICC_Profile has un-needed, not-empty finalize method

Philip Race philip.race at oracle.com
Fri Oct 11 22:43:50 UTC 2019



On 10/11/19, 2:52 PM, Sergey Bylokhov wrote:
> Hi, Phil.
>
> It looks like after the fix we will skip the call "unregisterDeferral" 
> and
> the ProfileActivator which was registered by the
> "ProfileDeferralMgr.registerDeferral" will not be removed --> memory 
> leak?

I discussed that below in my initial email. It won't in practice leak 
anything.

 > I had started to look at adding Disposer code to do the other thing that
 >the finalize() method does which is remove a deferred activation 
registration
 >but decided this was pointless.

 >That is used only for the pre-defined instances held in static 
variables of the class
 >and those live for the life of the VM so will never be freed ...

-phil.
>
> BTW do we have an option to mark this "finalize" as forRemoval=true or 
> just delete it?(example JDK-8159009/JDK-8212198)
>
> On 10/11/19 2:01 pm, Philip Race wrote:
>> Bug: ICC_Profile has un-needed, not-empty finalize method
>> Webrev: http://cr.openjdk.java.net/~prr/8175984/
>>
>> This is a native memory utilisation problem due to delay in 
>> collecting and
>> freeing ICC_Profiles and their associated classes and data.
>>
>> The color management engine is native code and consumes the stream of 
>> data
>> representing the ICC profile and constructs internal native data 
>> structures.
>> The delay is because the garbage collector doesn't know about the 
>> native memory
>> consumption and from a Java perspective there is no need to initiate 
>> garbage collection.
>>
>> But it is worse than that because even collection when does happen it 
>> is delayed in
>> freeing this memory.
>>
>> The native data is referenced internally via a Profile object which 
>> is registered with the 2D disposer
>> so that the data will be freed after the disposer's  reference to it 
>> is enqueued and cleared.
>>
>> The disposer needing to run does add some delay but there's a further 
>> delay.
>>
>> ICC_Profile has  non-empty finalize which is there to free this 
>> native data.
>>
>> This used to matter with the old closed source CMS *only* because no 
>> one bothered
>> to implement 2D disposer support for it.
>>
>> But the call in finalize() is a no-op for LCMS
>>
>> So currently the ICC_Profile has to be finalized and only then can 
>> the GC initiate
>> clearing the weak refs and freeing the native data.
>>
>> Emptying the finalize() [*] method helps make the reclamation more 
>> prompt.
>> It is still possible to see large amounts of native memory consumed 
>> but it is
>> much better than before.
>>
>> [*] For those who don't know, the VM treats an empty finalize() 
>> method as non-existent
>> so the object does not need to be finalized.
>>
>> I had started to look at adding Disposer code to do the other thing that
>> the finalize() method does which is remove a deferred activation 
>> registration
>> but decided this was pointless.
>>
>> That is used only for the pre-defined instances held in static 
>> variables of the class
>> and those live for the life of the VM so will never be freed ...
>>
>> There is more clean up that could be done in the lower classes - is 
>> freeProfile needed any more ?
>> Do we actually want to keep the deferral mechanism ?
>>
>> Can we do something to provide a way to more promptly free the data, 
>> perhaps via new API ?
>>
>> But I decided to keep it to a minimum for safe and trivial 
>> backporting and leave the rest
>> to another day.
>>
>> -phil.
>>
>>
>>
>>
>
>


More information about the 2d-dev mailing list