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

Jayathirth Rao D V jayathirth.d.v at oracle.com
Thu Dec 5 04:54:41 UTC 2019


+1.

Thanks,
Jay

On 05/12/19, 10:14 AM, "2d-dev on behalf of Philip Race" <2d-dev-bounces at openjdk.java.net on behalf of philip.race at oracle.com> wrote:

    
    That is equivalent, just syntactic, so no issue there.
    Any other reviewers ? This needs two.
    
    -phil.
    
    On 12/4/19, 2:39 PM, Sergey Bylokhov wrote:
    > 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.
    >>
    >>
    >
    >
    




More information about the 2d-dev mailing list