Immediately notify VM of TOP process state
The delay was introduced to suppress JIT activity during startup. However, ART no longer uses the expicit process state signal as an input to informing JIT activity, so the delay can be removed. By forwarding the process state immediately, ART can make more informed decisions about activity based on process state, e.g., suppressing madvise calls for less important (non-foreground) processes. Bug: 235390330 Test: m + presubmit + boot tests Change-Id: Ia95a76f86cf4c38bf89e56f954dbf59e0083ec50 Merged-In: Ia95a76f86cf4c38bf89e56f954dbf59e0083ec50
This commit is contained in:
@@ -273,11 +273,6 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
private static final boolean DEBUG_PROVIDER = false;
|
||||
public static final boolean DEBUG_ORDER = false;
|
||||
private static final long MIN_TIME_BETWEEN_GCS = 5*1000;
|
||||
/**
|
||||
* If the activity doesn't become idle in time, the timeout will ensure to apply the pending top
|
||||
* process state.
|
||||
*/
|
||||
private static final long PENDING_TOP_PROCESS_STATE_TIMEOUT = 1000;
|
||||
/**
|
||||
* The delay to release the provider when it has no more references. It reduces the number of
|
||||
* transactions for acquiring and releasing provider if the client accesses the provider
|
||||
@@ -367,8 +362,6 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
private final AtomicInteger mNumLaunchingActivities = new AtomicInteger();
|
||||
@GuardedBy("mAppThread")
|
||||
private int mLastProcessState = PROCESS_STATE_UNKNOWN;
|
||||
@GuardedBy("mAppThread")
|
||||
private int mPendingProcessState = PROCESS_STATE_UNKNOWN;
|
||||
ArrayList<WeakReference<AssistStructure>> mLastAssistStructures = new ArrayList<>();
|
||||
private int mLastSessionId;
|
||||
final ArrayMap<IBinder, CreateServiceData> mServicesData = new ArrayMap<>();
|
||||
@@ -2384,7 +2377,6 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
if (stopProfiling) {
|
||||
mProfiler.stopProfiling();
|
||||
}
|
||||
applyPendingProcessState();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -3452,16 +3444,7 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
}
|
||||
wasCached = isCachedProcessState();
|
||||
mLastProcessState = processState;
|
||||
// Defer the top state for VM to avoid aggressive JIT compilation affecting activity
|
||||
// launch time.
|
||||
if (processState == ActivityManager.PROCESS_STATE_TOP
|
||||
&& mNumLaunchingActivities.get() > 0) {
|
||||
mPendingProcessState = processState;
|
||||
mH.postDelayed(this::applyPendingProcessState, PENDING_TOP_PROCESS_STATE_TIMEOUT);
|
||||
} else {
|
||||
mPendingProcessState = PROCESS_STATE_UNKNOWN;
|
||||
updateVmProcessState(processState);
|
||||
}
|
||||
updateVmProcessState(processState);
|
||||
if (localLOGV) {
|
||||
Slog.i(TAG, "******************* PROCESS STATE CHANGED TO: " + processState
|
||||
+ (fromIpc ? " (from ipc" : ""));
|
||||
@@ -3495,20 +3478,6 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
VMRuntime.getRuntime().updateProcessState(state);
|
||||
}
|
||||
|
||||
private void applyPendingProcessState() {
|
||||
synchronized (mAppThread) {
|
||||
if (mPendingProcessState == PROCESS_STATE_UNKNOWN) {
|
||||
return;
|
||||
}
|
||||
final int pendingState = mPendingProcessState;
|
||||
mPendingProcessState = PROCESS_STATE_UNKNOWN;
|
||||
// Only apply the pending state if the last state doesn't change.
|
||||
if (pendingState == mLastProcessState) {
|
||||
updateVmProcessState(pendingState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void countLaunchingActivities(int num) {
|
||||
mNumLaunchingActivities.getAndAdd(num);
|
||||
|
||||
Reference in New Issue
Block a user