[OpenJDK 2D-Dev] RFR: 8209113 : Use WeakReference for lastFontStrike for created Fonts

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Wed Dec 4 22:39:28 UTC 2019


Looks fine, the only suggestion is to use
   Integer.getInteger(String nm, Integer val)
instead of
   try{Integer.parseInt}catch{}



On 11/27/19 1:42 pm, Phil Race wrote:
> 
> Bug : https://bugs.openjdk.java.net/browse/JDK-8209113 <https://bugs.openjdk.java.net/browse/JDK-8209113>
> 
> Webrev: http://cr.openjdk.java.net/~prr/8209113/
> 
> 
> This fix is intended to update the ergonomics of font glyph caching which
> uses off-java heap native memory and so is not considered by garbage collection.
> The update has become needed as the GCs have changed to favour performance
> over reclaimation of resources as heaps have grown very large and client
> (and server) applications are being run with VMs with server focused ergonomics
> 
> Also note that this is actually more of a server problem than a client one,
> since a UI client usually uses a small number of fonts.
> Servers are often processing thousands of documents that contain custom
> fonts - typically all different - and reclaiming these more promptly will free
> up the native memory used by the font rasterizer data structures, and the
> temporary font files they use as well as the memory used to cache glyph images.
> 
> Each font instance has its own cache of strikes which in turn reference the native
> images, so there is no global management.
> This fix does not go so far as to look for a way to limit the amount of memory used
> by each font which would require some major surgery to the current GC managed
> approach.
> So the changes here are to allow more prompt clearing of references and
> recollection of the native memory by each font.
> 
> The important change is in Font2D where there is a SoftReference to the last used strike.
> https://bugs.openjdk.java.net/browse/JDK-8209113 observes that the reluctance of
> the VM to clear this SoftReference causes delays in freeing all of the resources.
> Now the code is updated to conditionally use a WeakReference.
> Using a WeakReference is controlled from the code in SunFontManager based
> on whether this is a temporary "created" font and how many temp fonts are
> being created. So this should not affect system fonts at all, and should also not
> affect an app using a small number of custom fonts while helping the server case a lot.
> 
> The other change is that FontStrikeDisposer no longer holds a reference to the Font2D.
> It needed it solely to call back to remove its strike from the Map of Strikes once
> it was collected. Now it holds a reference directly to the Map and its dispose
> method does the removal without needing to ask the Font2D.
> This does not make a lot of difference, but every bit helps.
> 
> Instrumented testing shows that together, for at least some workloads, these
> changes help smooth out native memory usage by making collection of temporary
> fonts more prompt. There are doubtless pathological cases that are still a problem
> and if you want to hold concurrent references in your application to 100,000 java.awt.Font
> instances, all of which are being used, then you need to size your server to cope ...
> 
> But this will be helpful in the typical ephemeral font case.
> 
> Random ideas that could go further but are out of scope of this fix are
> 1) An explicit dispose() method on a Font.
>      Problems here include the semantics of this for System fonts, backwards compatibility
> and ensuring no one is still using it. Even if the implementation is limited to clearing
> just the native memory usage these can still be issues and if you remove the backing
> file then you can never re-create it.
> 2) Some automatic internal per-font limitation on the amount of storage a Font uses.
>    Here there would also need to be some way to ensure code was locked out from using
>    it whilst this was happening. It may be more doable but it would mainly help the cases
>   where applications used the same font extensively. Not the case where thousands of
>   fonts are used minimally.
> 3) Looking to see if two fonts are actually identical. If a temp font is created from
>    a byte stream and the byte stream is identical to some other temp font then really
>    these are the same. If you have thousands of such shareable fonts this would be a big
>   win. But we'd need to have a way to locate all such temp fonts (that did not itself
> prevent their prompt collection) and quickly compare them - probably a hash calculated
> when they were created - and then do a full comparison when the hashes match.
> But if shareable fonts are rare, it won't help at all. However it might be worth exploring
> some day.
> 
> -phil.
> 
> 


-- 
Best regards, Sergey.


More information about the 2d-dev mailing list