Skip scheduling cached app compaction if there's already a pending one

Bug: 163297662
Test: atest CachedAppOptimizerTest
Test: Manual - Boot & check the logs
Change-Id: Ib8e8b1d68b0e9572ffa1362029316814757e9180
This commit is contained in:
Jing Ji
2021-03-23 12:31:28 -07:00
parent 1325fdd07a
commit 16afc22cdc
2 changed files with 43 additions and 14 deletions

View File

@@ -382,10 +382,13 @@ public final class CachedAppOptimizer {
@GuardedBy("mProcLock")
void compactAppSome(ProcessRecord app) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_SOME);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
if (!app.mOptRecord.hasPendingCompact()) {
app.mOptRecord.setHasPendingCompact(true);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
}
}
@GuardedBy("mProcLock")
@@ -396,10 +399,13 @@ public final class CachedAppOptimizer {
&& app.mState.getCurAdj() >= mCompactThrottleMinOomAdj
&& app.mState.getCurAdj() <= mCompactThrottleMaxOomAdj) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_FULL);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
if (!app.mOptRecord.hasPendingCompact()) {
app.mOptRecord.setHasPendingCompact(true);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
}
} else {
if (DEBUG_COMPACTION) {
Slog.d(TAG_AM, "Skipping full compaction for " + app.processName
@@ -412,10 +418,13 @@ public final class CachedAppOptimizer {
@GuardedBy("mProcLock")
void compactAppPersistent(ProcessRecord app) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_PERSISTENT);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
if (!app.mOptRecord.hasPendingCompact()) {
app.mOptRecord.setHasPendingCompact(true);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
COMPACT_PROCESS_MSG, app.mState.getCurAdj(), app.mState.getSetProcState()));
}
}
@GuardedBy("mProcLock")
@@ -427,10 +436,13 @@ public final class CachedAppOptimizer {
@GuardedBy("mProcLock")
void compactAppBfgs(ProcessRecord app) {
app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_BFGS);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
if (!app.mOptRecord.hasPendingCompact()) {
app.mOptRecord.setHasPendingCompact(true);
mPendingCompactionProcesses.add(app);
mCompactionHandler.sendMessage(
mCompactionHandler.obtainMessage(
COMPACT_PROCESS_MSG, app.mState.getCurAdj(), app.mState.getSetProcState()));
}
}
@GuardedBy("mProcLock")
@@ -954,6 +966,7 @@ public final class CachedAppOptimizer {
pendingAction = opt.getReqCompactAction();
pid = proc.getPid();
name = proc.processName;
opt.setHasPendingCompact(false);
// don't compact if the process has returned to perceptible
// and this is only a cached/home/prev compaction

View File

@@ -46,6 +46,12 @@ final class ProcessCachedOptimizerRecord {
@GuardedBy("mProcLock")
private int mLastCompactAction;
/**
* This process has been scheduled for a memory compaction.
*/
@GuardedBy("mProcLock")
private boolean mPendingCompact;
/**
* True when the process is frozen.
*/
@@ -100,6 +106,16 @@ final class ProcessCachedOptimizerRecord {
mLastCompactAction = lastCompactAction;
}
@GuardedBy("mProcLock")
boolean hasPendingCompact() {
return mPendingCompact;
}
@GuardedBy("mProcLock")
void setHasPendingCompact(boolean pendingCompact) {
mPendingCompact = pendingCompact;
}
@GuardedBy("mProcLock")
boolean isFrozen() {
return mFrozen;