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

Philip Race philip.race at oracle.com
Fri Oct 11 21:01:39 UTC 2019

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 
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 
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 
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.


More information about the 2d-dev mailing list