[OpenJDK 2D-Dev] RFR: 8209113 : Use WeakReference for lastFontStrike for created Fonts
Phil Race
philip.race at oracle.com
Thu Dec 5 21:25:24 UTC 2019
I made the one change suggested :
http://cr.openjdk.java.net/~prr/8209113.1
and pushed with that ..
-phil.
On 12/4/19 8:54 PM, Jayathirth Rao D V wrote:
> +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