From 1b7dda73e08a730d4377f1579ec209e55418c023 Mon Sep 17 00:00:00 2001 From: Jiakai Zhang Date: Wed, 21 Dec 2022 22:52:08 +0000 Subject: [PATCH] Fix the boot time regression caused by DexUseManagerLocal init. See details in the bug. Before: D SystemServerTiming: DexUseManagerLocal I system_server: Waiting for a blocking GC ClassLinker I system_server: Background concurrent copying GC freed 207020(9016KB) AllocSpace objects, 21(896KB) LOS objects, 49% free, 12MB/25MB, paused 56us,21us total 209.779ms I system_server: WaitForGcToComplete blocked ClassLinker on Background for 177.623ms V SystemServerTiming: DexUseManagerLocal took to complete: 182ms After: D SystemServerTiming: ArtModuleServiceInitializer V SystemServerTiming: ArtModuleServiceInitializer took to complete: 3ms ... D SystemServerTiming: DexUseManagerLocal V SystemServerTiming: DexUseManagerLocal took to complete: 20ms Bug: 263373204 Test: manual - See above. Change-Id: I81e517fd3c18ccd3490947b16e36e7d43b2fc07c --- services/java/com/android/server/SystemServer.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index bcb4ec98083be..8c709c42883bd 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1049,6 +1049,17 @@ public final class SystemServer implements Dumpable { private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) { t.traceBegin("startBootstrapServices"); + t.traceBegin("ArtModuleServiceInitializer"); + // This needs to happen before DexUseManagerLocal init. We do it here to avoid colliding + // with a GC. ArtModuleServiceInitializer is a class from a separate dex file + // "service-art.jar", so referencing it involves the class linker. The class linker and the + // GC are mutually exclusive (b/263486535). Therefore, we do this here to force trigger the + // class linker earlier. If we did this later, especially after PackageManagerService init, + // the class linker would be consistently blocked by a GC because PackageManagerService + // allocates a lot of memory and almost certainly triggers a GC. + ArtModuleServiceInitializer.setArtModuleServiceManager(new ArtModuleServiceManager()); + t.traceEnd(); + // Start the watchdog as early as possible so we can crash the system server // if we deadlock during early boot t.traceBegin("StartWatchdog"); @@ -1235,8 +1246,6 @@ public final class SystemServer implements Dumpable { t.traceBegin("DexUseManagerLocal"); // DexUseManagerLocal needs to be loaded after PackageManagerLocal has been registered, but // before PackageManagerService starts processing binder calls to notifyDexLoad. - // DexUseManagerLocal may also call artd, so ensure ArtModuleServiceManager is instantiated. - ArtModuleServiceInitializer.setArtModuleServiceManager(new ArtModuleServiceManager()); LocalManagerRegistry.addManager( DexUseManagerLocal.class, DexUseManagerLocal.createInstance()); t.traceEnd();