[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-2d-dev
Subject:    Re: [OpenJDK 2D-Dev] RFR: 8175984 : ICC_Profile has un-needed, not-empty finalize method
From:       Jayathirth Rao <jayathirth.d.v () oracle ! com>
Date:       2019-10-23 21:07:10
Message-ID: CC40E7B9-74FB-44C0-9802-472342E2345C () oracle ! com
[Download RAW message or body]

Changes are fine.

Thanks,
Jay

> On 11-Oct-2019, at 2:01 PM, Philip Race <philip.race@oracle.com> 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.
> 
> 
> 
> 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic