Merge "Run a GC after killing a UID due to binder proxy limit." into sc-qpr1-dev am: 745bc36216
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15889363 Change-Id: I8431c90f63f11016f6ad592284c3599cfbed3203
This commit is contained in:
@@ -74,7 +74,7 @@ public final class BinderProxy implements IBinder {
|
||||
private static final int MAIN_INDEX_SIZE = 1 << LOG_MAIN_INDEX_SIZE;
|
||||
private static final int MAIN_INDEX_MASK = MAIN_INDEX_SIZE - 1;
|
||||
// Debuggable builds will throw an AssertionError if the number of map entries exceeds:
|
||||
private static final int CRASH_AT_SIZE = 20_000;
|
||||
private static final int CRASH_AT_SIZE = 25_000;
|
||||
|
||||
/**
|
||||
* We next warn when we exceed this bucket size.
|
||||
|
||||
@@ -7742,6 +7742,17 @@ public class ActivityManagerService extends IActivityManager.Stub
|
||||
} else {
|
||||
killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid),
|
||||
"Too many Binders sent to SYSTEM");
|
||||
// We need to run a GC here, because killing the processes involved
|
||||
// actually isn't guaranteed to free up the proxies; in fact, if the
|
||||
// GC doesn't run for a long time, we may even exceed the global
|
||||
// proxy limit for a process (20000), resulting in system_server itself
|
||||
// being killed.
|
||||
// Note that the GC here might not actually clean up all the proxies,
|
||||
// because the binder reference decrements will come in asynchronously;
|
||||
// but if new processes belonging to the UID keep adding proxies, we
|
||||
// will get another callback here, and run the GC again - this time
|
||||
// cleaning up the old proxies.
|
||||
VMRuntime.getRuntime().requestConcurrentGC();
|
||||
}
|
||||
}, mHandler);
|
||||
t.traceEnd(); // setBinderProxies
|
||||
|
||||
Reference in New Issue
Block a user