diff options
-rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 1440e5fb559d..83ffb54af583 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -22,6 +22,9 @@ import static android.system.OsConstants.S_IRWXO; import android.content.res.Resources; import android.content.res.TypedArray; +import android.icu.impl.CacheValue; +import android.icu.text.DecimalFormatSymbols; +import android.icu.util.ULocale; import android.net.LocalServerSocket; import android.opengl.EGL14; import android.os.Process; @@ -181,6 +184,9 @@ public class ZygoteInit { static void preload() { Log.d(TAG, "begin preload"); + Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "BeginIcuCachePinning"); + beginIcuCachePinning(); + Trace.traceEnd(Trace.TRACE_TAG_DALVIK); Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadClasses"); preloadClasses(); Trace.traceEnd(Trace.TRACE_TAG_DALVIK); @@ -195,10 +201,34 @@ public class ZygoteInit { // Ask the WebViewFactory to do any initialization that must run in the zygote process, // for memory sharing purposes. WebViewFactory.prepareWebViewInZygote(); + endIcuCachePinning(); warmUpJcaProviders(); Log.d(TAG, "end preload"); } + private static void beginIcuCachePinning() { + // Pin ICU data in memory from this point that would normally be held by soft references. + // Without this, any references created immediately below or during class preloading + // would be collected when the Zygote GC runs in gcAndFinalize(). + Log.i(TAG, "Installing ICU cache reference pinning..."); + + CacheValue.setStrength(CacheValue.Strength.STRONG); + + Log.i(TAG, "Preloading ICU data..."); + // Explicitly exercise code to cache data apps are likely to need. + ULocale[] localesToPin = { ULocale.ROOT, ULocale.US, ULocale.getDefault() }; + for (ULocale uLocale : localesToPin) { + new DecimalFormatSymbols(uLocale); + } + } + + private static void endIcuCachePinning() { + // All cache references created by ICU from this point will be soft. + CacheValue.setStrength(CacheValue.Strength.SOFT); + + Log.i(TAG, "Uninstalled ICU cache reference pinning..."); + } + private static void preloadSharedLibraries() { Log.i(TAG, "Preloading shared libraries..."); System.loadLibrary("android"); |