diff options
| author | 2023-04-03 19:07:36 +0000 | |
|---|---|---|
| committer | 2023-04-03 19:07:36 +0000 | |
| commit | 65a646ae64bcf124a586feae16822cedf738c4fa (patch) | |
| tree | ad44d0825752d0af2668f430ba9297b1ae2df510 | |
| parent | 2e03f9f59ae566a9aafeeb4b1036fbc1cee395de (diff) | |
| parent | 0bf0398e4683155c7ca8b885d2567524ad77ad84 (diff) | |
Merge changes If2614951,I677af7bf into udc-dev
* changes:
Remove wasteful bfgs and services compaction flows
Make compaction happen after freezing
4 files changed, 34 insertions, 162 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 6c6ac1eb3030..350ac3bd4360 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -1095,7 +1095,7 @@ final class ActivityManagerShellCommand extends ShellCommand { synchronized (mInternal.mProcLock) { mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL, - CachedAppOptimizer.CompactSource.APP, true); + CachedAppOptimizer.CompactSource.SHELL, true); } pw.println("Finished full compaction for " + app.mPid); } else if (isSomeCompact) { @@ -1103,7 +1103,7 @@ final class ActivityManagerShellCommand extends ShellCommand { synchronized (mInternal.mProcLock) { mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.SOME, - CachedAppOptimizer.CompactSource.APP, true); + CachedAppOptimizer.CompactSource.SHELL, true); } pw.println("Finished some compaction for " + app.mPid); } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 192a2ba1df2a..9c1546324e4b 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -226,8 +226,8 @@ public final class CachedAppOptimizer { FULL // File+anon compaction } - // This indicates the process OOM memory state that initiated the compaction request - public enum CompactSource { APP, PERSISTENT, BFGS } + // This indicates who initiated the compaction request + public enum CompactSource { APP, SHELL } public enum CancelCompactReason { SCREEN_ON, // screen was turned on which cancels all compactions. @@ -373,10 +373,6 @@ public final class CachedAppOptimizer { @GuardedBy("mPhenotypeFlagLock") @VisibleForTesting volatile long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4; @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting volatile long mCompactThrottleBFGS = DEFAULT_COMPACT_THROTTLE_5; - @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting volatile long mCompactThrottlePersistent = DEFAULT_COMPACT_THROTTLE_6; - @GuardedBy("mPhenotypeFlagLock") @VisibleForTesting volatile long mCompactThrottleMinOomAdj = DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ; @GuardedBy("mPhenotypeFlagLock") @@ -635,8 +631,6 @@ public final class CachedAppOptimizer { pw.println(" " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull); pw.println(" " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome); pw.println(" " + KEY_COMPACT_THROTTLE_4 + "=" + mCompactThrottleFullFull); - pw.println(" " + KEY_COMPACT_THROTTLE_5 + "=" + mCompactThrottleBFGS); - pw.println(" " + KEY_COMPACT_THROTTLE_6 + "=" + mCompactThrottlePersistent); pw.println(" " + KEY_COMPACT_THROTTLE_MIN_OOM_ADJ + "=" + mCompactThrottleMinOomAdj); pw.println(" " + KEY_COMPACT_THROTTLE_MAX_OOM_ADJ + "=" + mCompactThrottleMaxOomAdj); pw.println(" " + KEY_COMPACT_STATSD_SAMPLE_RATE + "=" + mCompactStatsdSampleRate); @@ -728,32 +722,6 @@ public final class CachedAppOptimizer { } } - // This method returns true only if requirements are met. Note, that requirements are different - // from throttles applied at the time a compaction is trying to be executed in the sense that - // these are not subject to change dependent on time or memory as throttles usually do. - @GuardedBy("mProcLock") - boolean meetsCompactionRequirements(ProcessRecord proc) { - if (mAm.mInternal.isPendingTopUid(proc.uid)) { - // In case the OOM Adjust has not yet been propagated we see if this is - // pending on becoming top app in which case we should not compact. - if (DEBUG_COMPACTION) { - Slog.d(TAG_AM, "Skip compaction since UID is active for " + proc.processName); - } - return false; - } - - if (proc.mState.hasForegroundActivities()) { - if (DEBUG_COMPACTION) { - Slog.e(TAG_AM, - "Skip compaction as process " + proc.processName - + " has foreground activities"); - } - return false; - } - - return true; - } - @GuardedBy("mProcLock") boolean compactApp( ProcessRecord app, CompactProfile compactProfile, CompactSource source, boolean force) { @@ -777,7 +745,7 @@ public final class CachedAppOptimizer { return false; } - if (!app.mOptRecord.hasPendingCompact() && (meetsCompactionRequirements(app) || force)) { + if (!app.mOptRecord.hasPendingCompact()) { final String processName = (app.processName != null ? app.processName : ""); if (DEBUG_COMPACTION) { Slog.d(TAG_AM, @@ -795,8 +763,7 @@ public final class CachedAppOptimizer { if (DEBUG_COMPACTION) { Slog.d(TAG_AM, " compactApp Skipped for " + app.processName + " pendingCompact= " - + app.mOptRecord.hasPendingCompact() + " meetsCompactionRequirements=" - + meetsCompactionRequirements(app) + ". Requested compact profile: " + + app.mOptRecord.hasPendingCompact() + ". Requested compact profile: " + app.mOptRecord.getReqCompactProfile().name() + ". Compact source " + app.mOptRecord.getReqCompactSource().name()); } @@ -831,18 +798,6 @@ public final class CachedAppOptimizer { return stats; } - @GuardedBy("mProcLock") - boolean shouldCompactPersistent(ProcessRecord app, long now) { - return (app.mOptRecord.getLastCompactTime() == 0 - || (now - app.mOptRecord.getLastCompactTime()) > mCompactThrottlePersistent); - } - - @GuardedBy("mProcLock") - boolean shouldCompactBFGS(ProcessRecord app, long now) { - return (app.mOptRecord.getLastCompactTime() == 0 - || (now - app.mOptRecord.getLastCompactTime()) > mCompactThrottleBFGS); - } - void compactAllSystem() { if (useCompaction()) { if (DEBUG_COMPACTION) { @@ -1130,8 +1085,6 @@ public final class CachedAppOptimizer { mCompactThrottleSomeFull = Integer.parseInt(throttleSomeFullFlag); mCompactThrottleFullSome = Integer.parseInt(throttleFullSomeFlag); mCompactThrottleFullFull = Integer.parseInt(throttleFullFullFlag); - mCompactThrottleBFGS = Integer.parseInt(throttleBFGSFlag); - mCompactThrottlePersistent = Integer.parseInt(throttlePersistentFlag); mCompactThrottleMinOomAdj = Long.parseLong(throttleMinOomAdjFlag); mCompactThrottleMaxOomAdj = Long.parseLong(throttleMaxOomAdjFlag); } catch (NumberFormatException e) { @@ -1144,8 +1097,6 @@ public final class CachedAppOptimizer { mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2; mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3; mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4; - mCompactThrottleBFGS = DEFAULT_COMPACT_THROTTLE_5; - mCompactThrottlePersistent = DEFAULT_COMPACT_THROTTLE_6; mCompactThrottleMinOomAdj = DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ; mCompactThrottleMaxOomAdj = DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ; } @@ -1497,23 +1448,23 @@ public final class CachedAppOptimizer { @GuardedBy({"mService", "mProcLock"}) void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) { - // Cancel any currently executing compactions - // if the process moved out of cached state - if (newAdj < oldAdj && newAdj < ProcessList.CACHED_APP_MIN_ADJ) { - cancelCompactionForProcess(app, CancelCompactReason.OOM_IMPROVEMENT); + if (useCompaction()) { + // Cancel any currently executing compactions + // if the process moved out of cached state + if (newAdj < oldAdj && newAdj < ProcessList.CACHED_APP_MIN_ADJ) { + cancelCompactionForProcess(app, CancelCompactReason.OOM_IMPROVEMENT); + } } + } - if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ - && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) { - if (ENABLE_FILE_COMPACT) { - // Perform a minor compaction when a perceptible app becomes the prev/home app - compactApp(app, CompactProfile.SOME, CompactSource.APP, false); + /** + * Callback received after a process has been frozen. + */ + void onProcessFrozen(ProcessRecord frozenProc) { + if (useCompaction()) { + synchronized (mProcLock) { + compactApp(frozenProc, CompactProfile.FULL, CompactSource.APP, false); } - } else if (oldAdj < ProcessList.CACHED_APP_MIN_ADJ - && newAdj >= ProcessList.CACHED_APP_MIN_ADJ - && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) { - // Perform a major compaction when any app enters cached - compactApp(app, CompactProfile.FULL, CompactSource.APP, false); } } @@ -1687,26 +1638,6 @@ public final class CachedAppOptimizer { return true; } } - } else if (source == CompactSource.PERSISTENT) { - if (start - lastCompactTime < mCompactThrottlePersistent) { - if (DEBUG_COMPACTION) { - Slog.d(TAG_AM, - "Skipping persistent compaction for " + name - + ": too soon. throttle=" + mCompactThrottlePersistent - + " last=" + (start - lastCompactTime) + "ms ago"); - } - return true; - } - } else if (source == CompactSource.BFGS) { - if (start - lastCompactTime < mCompactThrottleBFGS) { - if (DEBUG_COMPACTION) { - Slog.d(TAG_AM, - "Skipping bfgs compaction for " + name - + ": too soon. throttle=" + mCompactThrottleBFGS - + " last=" + (start - lastCompactTime) + "ms ago"); - } - return true; - } } } @@ -2021,6 +1952,9 @@ public final class CachedAppOptimizer { } } } + if (proc.mOptRecord.isFrozen()) { + onProcessFrozen(proc); + } } break; case REPORT_UNFREEZE_MSG: @@ -2050,6 +1984,10 @@ public final class CachedAppOptimizer { freezeAppAsyncLSP(proc); } + /** + * Freeze a process. + * @param proc process to be frozen + */ @GuardedBy({"mAm"}) private void freezeProcess(final ProcessRecord proc) { int pid = proc.getPid(); // Unlocked intentionally @@ -2083,6 +2021,10 @@ public final class CachedAppOptimizer { if (pid == 0 || opt.isFrozen()) { // Already frozen or not a real process, either one being // launched or one being killed + if (DEBUG_FREEZER) { + Slog.d(TAG_AM, "Skipping freeze for process " + pid + + " " + name + ". Already frozen or not a real process"); + } return; } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index a86c02d4b826..a98571b68067 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2937,30 +2937,8 @@ public class OomAdjuster { int changes = 0; - // don't compact during bootup - if (mCachedAppOptimizer.useCompaction() && mService.mBooted) { - // Cached and prev/home compaction - // reminder: here, setAdj is previous state, curAdj is upcoming state - if (state.getCurAdj() != state.getSetAdj()) { - mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app); - } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE) { - // See if we can compact persistent and bfgs services now that screen is off - if (state.getSetAdj() < FOREGROUND_APP_ADJ - && !state.isRunningRemoteAnimation() - // Because these can fire independent of oom_adj/procstate changes, we need - // to throttle the actual dispatch of these requests in addition to the - // processing of the requests. As a result, there is throttling both here - // and in CachedAppOptimizer. - && mCachedAppOptimizer.shouldCompactPersistent(app, now)) { - mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL, - CachedAppOptimizer.CompactSource.PERSISTENT, false); - } else if (state.getCurProcState() - == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE - && mCachedAppOptimizer.shouldCompactBFGS(app, now)) { - mCachedAppOptimizer.compactApp(app, CachedAppOptimizer.CompactProfile.FULL, - CachedAppOptimizer.CompactSource.BFGS, false); - } - } + if (state.getCurAdj() != state.getSetAdj()) { + mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app); } if (state.getCurAdj() != state.getSetAdj()) { diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java index 1fbb8dd5ac9d..eb6efd2e859f 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java @@ -166,10 +166,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE); assertThat(mCachedAppOptimizerUnderTest.mFreezerStatsdSampleRate).isEqualTo( CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); assertThat(mCachedAppOptimizerUnderTest.mFullAnonRssThrottleKb).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB); assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo( @@ -261,10 +257,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3 + 1); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4 + 1); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1); assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_FULL_DELTA_RSS_THROTTLE_KB + 1); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo( @@ -275,10 +267,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE + 0.1f); assertThat(mCachedAppOptimizerUnderTest.mFreezerStatsdSampleRate).isEqualTo( CachedAppOptimizer.DEFAULT_STATSD_SAMPLE_RATE + 0.1f); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1); assertThat(mCachedAppOptimizerUnderTest.mFullAnonRssThrottleKb).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB + 1); assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle).containsExactly(1, 2, 3); @@ -425,10 +413,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3 + 1); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4 + 1); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5 + 1); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ + 1); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMaxOomAdj).isEqualTo( @@ -454,10 +438,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); // Repeat for each of the throttle keys. mCountDown = new CountDownLatch(1); @@ -472,10 +452,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); mCountDown = new CountDownLatch(1); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -489,10 +465,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); mCountDown = new CountDownLatch(1); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -506,10 +478,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); mCountDown = new CountDownLatch(1); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -523,10 +491,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); mCountDown = new CountDownLatch(1); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -540,10 +504,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_3); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleFullFull).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_4); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleBFGS).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_5); - assertThat(mCachedAppOptimizerUnderTest.mCompactThrottlePersistent).isEqualTo( - CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6); } @Test @@ -953,15 +913,7 @@ public final class CachedAppOptimizerTest { mProcessDependencies.setRssAfterCompaction(rssAfter); // When moving within cached state - mCachedAppOptimizerUnderTest.onOomAdjustChanged( - ProcessList.CACHED_APP_MIN_ADJ, ProcessList.CACHED_APP_MIN_ADJ + 1, processRecord); - waitForHandler(); - // THEN process IS NOT compacted. - assertThat(mCachedAppOptimizerUnderTest.mLastCompactionStats.get(pid)).isNull(); - - // When moving into cached state - mCachedAppOptimizerUnderTest.onOomAdjustChanged(ProcessList.CACHED_APP_MIN_ADJ - 1, - ProcessList.CACHED_APP_MIN_ADJ + 1, processRecord); + mCachedAppOptimizerUnderTest.onProcessFrozen(processRecord); waitForHandler(); // THEN process IS compacted. assertThat(mCachedAppOptimizerUnderTest.mLastCompactionStats.get(pid)).isNotNull(); |