From daf8e751d42741bde80bdbcbe68967ec3e1fcf51 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 16 Feb 2011 15:58:28 -0800 Subject: [PATCH] 7019441: No lookup cache for internal composite font creation leads to java heap growth Reviewed-by: igor, jgodinez --- .../share/classes/sun/font/FontUtilities.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/jdk/src/share/classes/sun/font/FontUtilities.java b/jdk/src/share/classes/sun/font/FontUtilities.java index ef53c60de08..6f3c6d12a14 100644 --- a/jdk/src/share/classes/sun/font/FontUtilities.java +++ b/jdk/src/share/classes/sun/font/FontUtilities.java @@ -30,6 +30,8 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; +import java.lang.ref.SoftReference; +import java.util.concurrent.ConcurrentHashMap; import java.security.AccessController; import java.security.PrivilegedAction; @@ -383,6 +385,10 @@ public final class FontUtilities { * } * return fuir; */ + private static volatile + SoftReference> + compMapRef = new SoftReference(null); + public static FontUIResource getCompositeFontUIResource(Font font) { FontUIResource fuir = new FontUIResource(font); @@ -402,12 +408,22 @@ public final class FontUtilities { FontManager fm = FontManagerFactory.getInstance(); CompositeFont dialog2D = - (CompositeFont) fm.findFont2D("dialog", font.getStyle(), FontManager.NO_FALLBACK); + (CompositeFont) fm.findFont2D("dialog", font.getStyle(), + FontManager.NO_FALLBACK); if (dialog2D == null) { /* shouldn't happen */ return fuir; } PhysicalFont physicalFont = (PhysicalFont)font2D; - CompositeFont compFont = new CompositeFont(physicalFont, dialog2D); + ConcurrentHashMap compMap = compMapRef.get(); + if (compMap == null) { // Its been collected. + compMap = new ConcurrentHashMap(); + compMapRef = new SoftReference(compMap); + } + CompositeFont compFont = compMap.get(physicalFont); + if (compFont == null) { + compFont = new CompositeFont(physicalFont, dialog2D); + compMap.put(physicalFont, compFont); + } FontAccess.getFontAccess().setFont2D(fuir, compFont.handle); /* marking this as a created font is needed as only created fonts * copy their creator's handles.