blob: d7decb4126fcdfde8004606124fb0c292ab6a368 [file] [log] [blame]
Dianne Hackborn0ef403e2017-01-24 18:22:15 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.am;
18
Michal Karpinski8596ded2018-11-14 14:43:48 +000019import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;
20
Ben Murdochc26a5a82019-01-16 10:05:58 +000021import android.app.ActivityThread;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080022import android.content.ContentResolver;
Kweku Adamsfa825632019-03-04 16:19:19 -080023import android.content.Context;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080024import android.database.ContentObserver;
25import android.net.Uri;
Kweku Adamsfa825632019-03-04 16:19:19 -080026import android.os.Build;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080027import android.os.Handler;
Ben Murdochc26a5a82019-01-16 10:05:58 +000028import android.provider.DeviceConfig;
29import android.provider.DeviceConfig.OnPropertyChangedListener;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080030import android.provider.Settings;
Ben Murdochc26a5a82019-01-16 10:05:58 +000031import android.text.TextUtils;
Michal Karpinski666631b2019-02-26 16:59:11 +000032import android.text.TextUtils.SimpleStringSplitter;
33import android.util.ArraySet;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080034import android.util.KeyValueListParser;
35import android.util.Slog;
36
37import java.io.PrintWriter;
38
39/**
40 * Settings constants that can modify the activity manager's behavior.
41 */
42final class ActivityManagerConstants extends ContentObserver {
Kweku Adamsfa825632019-03-04 16:19:19 -080043 private static final String TAG = "ActivityManagerConstants";
Amith Yamasanib0c8a882017-08-28 09:36:42 -070044
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080045 // Key names stored in the settings value.
Dianne Hackborn83b40f62017-04-26 13:59:47 -070046 private static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
Dianne Hackborncb015632017-06-14 17:30:15 -070047 private static final String KEY_FGSERVICE_MIN_SHOWN_TIME
48 = "fgservice_min_shown_time";
49 private static final String KEY_FGSERVICE_MIN_REPORT_TIME
50 = "fgservice_min_report_time";
51 private static final String KEY_FGSERVICE_SCREEN_ON_BEFORE_TIME
52 = "fgservice_screen_on_before_time";
53 private static final String KEY_FGSERVICE_SCREEN_ON_AFTER_TIME
54 = "fgservice_screen_on_after_time";
Dianne Hackborn83b40f62017-04-26 13:59:47 -070055 private static final String KEY_CONTENT_PROVIDER_RETAIN_TIME = "content_provider_retain_time";
56 private static final String KEY_GC_TIMEOUT = "gc_timeout";
57 private static final String KEY_GC_MIN_INTERVAL = "gc_min_interval";
58 private static final String KEY_FULL_PSS_MIN_INTERVAL = "full_pss_min_interval";
59 private static final String KEY_FULL_PSS_LOWERED_INTERVAL = "full_pss_lowered_interval";
Dianne Hackbornffca58b2017-05-24 16:15:45 -070060 private static final String KEY_POWER_CHECK_INTERVAL = "power_check_interval";
61 private static final String KEY_POWER_CHECK_MAX_CPU_1 = "power_check_max_cpu_1";
62 private static final String KEY_POWER_CHECK_MAX_CPU_2 = "power_check_max_cpu_2";
63 private static final String KEY_POWER_CHECK_MAX_CPU_3 = "power_check_max_cpu_3";
64 private static final String KEY_POWER_CHECK_MAX_CPU_4 = "power_check_max_cpu_4";
Dianne Hackborn83b40f62017-04-26 13:59:47 -070065 private static final String KEY_SERVICE_USAGE_INTERACTION_TIME
66 = "service_usage_interaction_time";
67 private static final String KEY_USAGE_STATS_INTERACTION_INTERVAL
68 = "usage_stats_interaction_interval";
69 static final String KEY_SERVICE_RESTART_DURATION = "service_restart_duration";
70 static final String KEY_SERVICE_RESET_RUN_DURATION = "service_reset_run_duration";
71 static final String KEY_SERVICE_RESTART_DURATION_FACTOR = "service_restart_duration_factor";
72 static final String KEY_SERVICE_MIN_RESTART_TIME_BETWEEN = "service_min_restart_time_between";
73 static final String KEY_MAX_SERVICE_INACTIVITY = "service_max_inactivity";
74 static final String KEY_BG_START_TIMEOUT = "service_bg_start_timeout";
Michal Karpinskie069b002019-03-07 16:15:14 +000075 static final String KEY_SERVICE_BG_ACTIVITY_START_TIMEOUT = "service_bg_activity_start_timeout";
Amith Yamasanib0c8a882017-08-28 09:36:42 -070076 static final String KEY_BOUND_SERVICE_CRASH_RESTART_DURATION = "service_crash_restart_duration";
77 static final String KEY_BOUND_SERVICE_CRASH_MAX_RETRY = "service_crash_max_retry";
Sudheer Shankaf6690102017-10-16 10:20:32 -070078 static final String KEY_PROCESS_START_ASYNC = "process_start_async";
Dianne Hackborn8c76d912018-08-23 15:20:05 -070079 static final String KEY_MEMORY_INFO_THROTTLE_TIME = "memory_info_throttle_time";
Amith Yamasanie5bfeee2018-09-05 18:52:35 -070080 static final String KEY_TOP_TO_FGS_GRACE_DURATION = "top_to_fgs_grace_duration";
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080081
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080082 private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070083 private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
Dianne Hackborncb015632017-06-14 17:30:15 -070084 private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000;
85 private static final long DEFAULT_FGSERVICE_MIN_REPORT_TIME = 3*1000;
86 private static final long DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME = 1*1000;
87 private static final long DEFAULT_FGSERVICE_SCREEN_ON_AFTER_TIME = 5*1000;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070088 private static final long DEFAULT_CONTENT_PROVIDER_RETAIN_TIME = 20*1000;
89 private static final long DEFAULT_GC_TIMEOUT = 5*1000;
90 private static final long DEFAULT_GC_MIN_INTERVAL = 60*1000;
Dianne Hackborn052e3142017-12-19 16:08:30 -080091 private static final long DEFAULT_FULL_PSS_MIN_INTERVAL = 20*60*1000;
92 private static final long DEFAULT_FULL_PSS_LOWERED_INTERVAL = 5*60*1000;
Dianne Hackbornffca58b2017-05-24 16:15:45 -070093 private static final long DEFAULT_POWER_CHECK_INTERVAL = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
94 private static final int DEFAULT_POWER_CHECK_MAX_CPU_1 = 25;
95 private static final int DEFAULT_POWER_CHECK_MAX_CPU_2 = 25;
96 private static final int DEFAULT_POWER_CHECK_MAX_CPU_3 = 10;
97 private static final int DEFAULT_POWER_CHECK_MAX_CPU_4 = 2;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070098 private static final long DEFAULT_SERVICE_USAGE_INTERACTION_TIME = 30*60*1000;
Amith Yamasani119be9a2018-02-18 22:23:00 -080099 private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 2*60*60*1000L;
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700100 private static final long DEFAULT_SERVICE_RESTART_DURATION = 1*1000;
101 private static final long DEFAULT_SERVICE_RESET_RUN_DURATION = 60*1000;
102 private static final int DEFAULT_SERVICE_RESTART_DURATION_FACTOR = 4;
103 private static final long DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
104 private static final long DEFAULT_MAX_SERVICE_INACTIVITY = 30*60*1000;
105 private static final long DEFAULT_BG_START_TIMEOUT = 15*1000;
Michal Karpinskie069b002019-03-07 16:15:14 +0000106 private static final long DEFAULT_SERVICE_BG_ACTIVITY_START_TIMEOUT = 10_000;
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700107 private static final long DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION = 30*60_000;
108 private static final int DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY = 16;
Sudheer Shankaf6690102017-10-16 10:20:32 -0700109 private static final boolean DEFAULT_PROCESS_START_ASYNC = true;
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700110 private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000;
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700111 private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800112
Matt Pape40074da2019-02-12 13:53:26 -0800113 // Flag stored in the DeviceConfig API.
114 /**
115 * Maximum number of cached processes.
116 */
117 private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
118
Alan Stokesfb227072019-03-29 16:45:16 +0000119 /**
120 * Default value for mFlagBackgroundActivityStartsEnabled if not explicitly set in
121 * Settings.Global. This allows it to be set experimentally unless it has been
122 * enabled/disabled in developer options. Defaults to true.
123 */
124 private static final String KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED =
125 "default_background_activity_starts_enabled";
126
127 /**
128 * The packages temporarily whitelisted to be able to start activities from background.
129 * The list of packages is {@code ":"} colon delimited.
130 */
131 private static final String KEY_BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST =
132 "background_activity_starts_package_names_whitelist";
133
134
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800135 // Maximum number of cached processes we will allow.
136 public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
137
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700138 // This is the amount of time we allow an app to settle after it goes into the background,
139 // before we start restricting what it can do.
140 public long BACKGROUND_SETTLE_TIME = DEFAULT_BACKGROUND_SETTLE_TIME;
141
Dianne Hackborncb015632017-06-14 17:30:15 -0700142 // The minimum time we allow a foreground service to run with a notification and the
143 // screen on without otherwise telling the user about it. (If it runs for less than this,
144 // it will still be reported to the user as a running app for at least this amount of time.)
145 public long FGSERVICE_MIN_SHOWN_TIME = DEFAULT_FGSERVICE_MIN_SHOWN_TIME;
146
147 // If a foreground service is shown for less than FGSERVICE_MIN_SHOWN_TIME, we will display
148 // the background app running notification about it for at least this amount of time (if it
149 // is larger than the remaining shown time).
150 public long FGSERVICE_MIN_REPORT_TIME = DEFAULT_FGSERVICE_MIN_REPORT_TIME;
151
152 // The minimum amount of time the foreground service needs to have remain being shown
153 // before the screen goes on for us to consider it not worth showing to the user. That is
154 // if an app has a foreground service that stops itself this amount of time or more before
155 // the user turns on the screen, we will just let it go without the user being told about it.
156 public long FGSERVICE_SCREEN_ON_BEFORE_TIME = DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME;
157
158 // The minimum amount of time a foreground service should remain reported to the user if
159 // it is stopped when the screen turns on. This is the time from when the screen turns
160 // on until we will stop reporting it.
161 public long FGSERVICE_SCREEN_ON_AFTER_TIME = DEFAULT_FGSERVICE_SCREEN_ON_AFTER_TIME;
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700162
163 // How long we will retain processes hosting content providers in the "last activity"
164 // state before allowing them to drop down to the regular cached LRU list. This is
165 // to avoid thrashing of provider processes under low memory situations.
166 long CONTENT_PROVIDER_RETAIN_TIME = DEFAULT_CONTENT_PROVIDER_RETAIN_TIME;
167
168 // How long to wait after going idle before forcing apps to GC.
169 long GC_TIMEOUT = DEFAULT_GC_TIMEOUT;
170
171 // The minimum amount of time between successive GC requests for a process.
172 long GC_MIN_INTERVAL = DEFAULT_GC_MIN_INTERVAL;
173
174 // The minimum amount of time between successive PSS requests for a process.
175 long FULL_PSS_MIN_INTERVAL = DEFAULT_FULL_PSS_MIN_INTERVAL;
176
177 // The minimum amount of time between successive PSS requests for a process
178 // when the request is due to the memory state being lowered.
179 long FULL_PSS_LOWERED_INTERVAL = DEFAULT_FULL_PSS_LOWERED_INTERVAL;
180
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700181 // The minimum sample duration we will allow before deciding we have
182 // enough data on CPU usage to start killing things.
Dianne Hackbornffca58b2017-05-24 16:15:45 -0700183 long POWER_CHECK_INTERVAL = DEFAULT_POWER_CHECK_INTERVAL;
184
185 // The maximum CPU (as a percentage) a process is allowed to use over the first
186 // power check interval that it is cached.
187 int POWER_CHECK_MAX_CPU_1 = DEFAULT_POWER_CHECK_MAX_CPU_1;
188
189 // The maximum CPU (as a percentage) a process is allowed to use over the second
190 // power check interval that it is cached. The home app will never check for less
191 // CPU than this (it will not test against the 3 or 4 levels).
192 int POWER_CHECK_MAX_CPU_2 = DEFAULT_POWER_CHECK_MAX_CPU_2;
193
194 // The maximum CPU (as a percentage) a process is allowed to use over the third
195 // power check interval that it is cached.
196 int POWER_CHECK_MAX_CPU_3 = DEFAULT_POWER_CHECK_MAX_CPU_3;
197
198 // The maximum CPU (as a percentage) a process is allowed to use over the fourth
199 // power check interval that it is cached.
200 int POWER_CHECK_MAX_CPU_4 = DEFAULT_POWER_CHECK_MAX_CPU_4;
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700201
202 // This is the amount of time an app needs to be running a foreground service before
203 // we will consider it to be doing interaction for usage stats.
204 long SERVICE_USAGE_INTERACTION_TIME = DEFAULT_SERVICE_USAGE_INTERACTION_TIME;
205
206 // Maximum amount of time we will allow to elapse before re-reporting usage stats
207 // interaction with foreground processes.
208 long USAGE_STATS_INTERACTION_INTERVAL = DEFAULT_USAGE_STATS_INTERACTION_INTERVAL;
209
210 // How long a service needs to be running until restarting its process
211 // is no longer considered to be a relaunch of the service.
212 public long SERVICE_RESTART_DURATION = DEFAULT_SERVICE_RESTART_DURATION;
213
214 // How long a service needs to be running until it will start back at
215 // SERVICE_RESTART_DURATION after being killed.
216 public long SERVICE_RESET_RUN_DURATION = DEFAULT_SERVICE_RESET_RUN_DURATION;
217
218 // Multiplying factor to increase restart duration time by, for each time
219 // a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
220 public int SERVICE_RESTART_DURATION_FACTOR = DEFAULT_SERVICE_RESTART_DURATION_FACTOR;
221
222 // The minimum amount of time between restarting services that we allow.
223 // That is, when multiple services are restarting, we won't allow each
224 // to restart less than this amount of time from the last one.
225 public long SERVICE_MIN_RESTART_TIME_BETWEEN = DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN;
226
227 // Maximum amount of time for there to be no activity on a service before
228 // we consider it non-essential and allow its process to go on the
229 // LRU background list.
230 public long MAX_SERVICE_INACTIVITY = DEFAULT_MAX_SERVICE_INACTIVITY;
231
232 // How long we wait for a background started service to stop itself before
233 // allowing the next pending start to run.
234 public long BG_START_TIMEOUT = DEFAULT_BG_START_TIMEOUT;
235
Michal Karpinskie069b002019-03-07 16:15:14 +0000236 // For how long after a whitelisted service's start its process can start a background activity
237 public long SERVICE_BG_ACTIVITY_START_TIMEOUT = DEFAULT_SERVICE_BG_ACTIVITY_START_TIMEOUT;
238
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700239 // Initial backoff delay for retrying bound foreground services
240 public long BOUND_SERVICE_CRASH_RESTART_DURATION = DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION;
241
242 // Maximum number of retries for bound foreground services that crash soon after start
243 public long BOUND_SERVICE_MAX_CRASH_RETRY = DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY;
244
Sudheer Shankaf6690102017-10-16 10:20:32 -0700245 // Indicates if the processes need to be started asynchronously.
246 public boolean FLAG_PROCESS_START_ASYNC = DEFAULT_PROCESS_START_ASYNC;
247
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700248 // The minimum time we allow between requests for the MemoryInfo of a process to
249 // throttle requests from apps.
250 public long MEMORY_INFO_THROTTLE_TIME = DEFAULT_MEMORY_INFO_THROTTLE_TIME;
251
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700252 // Allow app just moving from TOP to FOREGROUND_SERVICE to stay in a higher adj value for
253 // this long.
254 public long TOP_TO_FGS_GRACE_DURATION = DEFAULT_TOP_TO_FGS_GRACE_DURATION;
255
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100256 // Indicates whether the activity starts logging is enabled.
257 // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700258 volatile boolean mFlagActivityStartsLoggingEnabled;
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100259
Michal Karpinski8596ded2018-11-14 14:43:48 +0000260 // Indicates whether the background activity starts is enabled.
Alan Stokesfb227072019-03-29 16:45:16 +0000261 // Controlled by Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED.
262 // If not set explicitly the default is controlled by DeviceConfig.
Michal Karpinski8596ded2018-11-14 14:43:48 +0000263 volatile boolean mFlagBackgroundActivityStartsEnabled;
264
Michal Karpinski666631b2019-02-26 16:59:11 +0000265 volatile ArraySet<String> mPackageNamesWhitelistedForBgActivityStarts = new ArraySet<>();
266
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800267 private final ActivityManagerService mService;
268 private ContentResolver mResolver;
269 private final KeyValueListParser mParser = new KeyValueListParser(',');
270
271 private int mOverrideMaxCachedProcesses = -1;
272
273 // The maximum number of cached processes we will keep around before killing them.
274 // NOTE: this constant is *only* a control to not let us go too crazy with
275 // keeping around processes on devices with large amounts of RAM. For devices that
276 // are tighter on RAM, the out of memory killer is responsible for killing background
277 // processes as RAM is needed, and we should *never* be relying on this limit to
278 // kill them. Also note that this limit only applies to cached background processes;
279 // we have no limit on the number of service, visible, foreground, or other such
280 // processes and the number of those processes does not count against the cached
281 // process limit.
282 public int CUR_MAX_CACHED_PROCESSES;
283
284 // The maximum number of empty app processes we will let sit around.
285 public int CUR_MAX_EMPTY_PROCESSES;
286
287 // The number of empty apps at which we don't consider it necessary to do
288 // memory trimming.
289 public int CUR_TRIM_EMPTY_PROCESSES;
290
291 // The number of cached at which we don't consider it necessary to do
292 // memory trimming.
293 public int CUR_TRIM_CACHED_PROCESSES;
294
Kweku Adamsfa825632019-03-04 16:19:19 -0800295 private static final long MIN_AUTOMATIC_HEAP_DUMP_PSS_THRESHOLD_BYTES = 100 * 1024; // 100 KB
296
297 private final boolean mSystemServerAutomaticHeapDumpEnabled;
298
299 /** Package to report to when the memory usage exceeds the limit. */
300 private final String mSystemServerAutomaticHeapDumpPackageName;
301
302 /** Byte limit for dump heap monitoring. */
303 private long mSystemServerAutomaticHeapDumpPssThresholdBytes;
304
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100305 private static final Uri ACTIVITY_MANAGER_CONSTANTS_URI = Settings.Global.getUriFor(
306 Settings.Global.ACTIVITY_MANAGER_CONSTANTS);
307
308 private static final Uri ACTIVITY_STARTS_LOGGING_ENABLED_URI = Settings.Global.getUriFor(
309 Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED);
310
Michal Karpinski8596ded2018-11-14 14:43:48 +0000311 private static final Uri BACKGROUND_ACTIVITY_STARTS_ENABLED_URI =
312 Settings.Global.getUriFor(
313 Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED);
314
Kweku Adamsfa825632019-03-04 16:19:19 -0800315 private static final Uri ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI =
316 Settings.Global.getUriFor(Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS);
317
Ben Murdochc26a5a82019-01-16 10:05:58 +0000318 private final OnPropertyChangedListener mOnDeviceConfigChangedListener =
319 new OnPropertyChangedListener() {
320 @Override
321 public void onPropertyChanged(String namespace, String name, String value) {
Alan Stokesfb227072019-03-29 16:45:16 +0000322 if (name == null) {
323 return;
324 }
325 switch (name) {
326 case KEY_MAX_CACHED_PROCESSES:
327 updateMaxCachedProcesses();
328 break;
329 case KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED:
330 case KEY_BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST:
331 updateBackgroundActivityStarts();
332 break;
333 default:
334 break;
Ben Murdochc26a5a82019-01-16 10:05:58 +0000335 }
336 }
337 };
338
Kweku Adamsfa825632019-03-04 16:19:19 -0800339 ActivityManagerConstants(Context context, ActivityManagerService service, Handler handler) {
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800340 super(handler);
341 mService = service;
Kweku Adamsfa825632019-03-04 16:19:19 -0800342 mSystemServerAutomaticHeapDumpEnabled = Build.IS_DEBUGGABLE
343 && context.getResources().getBoolean(
344 com.android.internal.R.bool.config_debugEnableAutomaticSystemServerHeapDumps);
345 mSystemServerAutomaticHeapDumpPackageName = context.getPackageName();
346 mSystemServerAutomaticHeapDumpPssThresholdBytes = Math.max(
347 MIN_AUTOMATIC_HEAP_DUMP_PSS_THRESHOLD_BYTES,
348 context.getResources().getInteger(
349 com.android.internal.R.integer.config_debugSystemServerPssThresholdBytes));
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800350 }
351
352 public void start(ContentResolver resolver) {
353 mResolver = resolver;
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100354 mResolver.registerContentObserver(ACTIVITY_MANAGER_CONSTANTS_URI, false, this);
355 mResolver.registerContentObserver(ACTIVITY_STARTS_LOGGING_ENABLED_URI, false, this);
Michal Karpinski8596ded2018-11-14 14:43:48 +0000356 mResolver.registerContentObserver(BACKGROUND_ACTIVITY_STARTS_ENABLED_URI, false, this);
Kweku Adamsfa825632019-03-04 16:19:19 -0800357 if (mSystemServerAutomaticHeapDumpEnabled) {
358 mResolver.registerContentObserver(ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI,
359 false, this);
360 }
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800361 updateConstants();
Kweku Adamsfa825632019-03-04 16:19:19 -0800362 if (mSystemServerAutomaticHeapDumpEnabled) {
363 updateEnableAutomaticSystemServerHeapDumps();
364 }
Matt Pape40074da2019-02-12 13:53:26 -0800365 DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
Ben Murdochc26a5a82019-01-16 10:05:58 +0000366 ActivityThread.currentApplication().getMainExecutor(),
367 mOnDeviceConfigChangedListener);
368 updateMaxCachedProcesses();
Alan Stokesfb227072019-03-29 16:45:16 +0000369 updateActivityStartsLoggingEnabled();
370 updateBackgroundActivityStarts();
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800371 }
372
373 public void setOverrideMaxCachedProcesses(int value) {
374 mOverrideMaxCachedProcesses = value;
375 updateMaxCachedProcesses();
376 }
377
378 public int getOverrideMaxCachedProcesses() {
379 return mOverrideMaxCachedProcesses;
380 }
381
382 public static int computeEmptyProcessLimit(int totalProcessLimit) {
383 return totalProcessLimit/2;
384 }
385
386 @Override
387 public void onChange(boolean selfChange, Uri uri) {
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100388 if (uri == null) return;
389 if (ACTIVITY_MANAGER_CONSTANTS_URI.equals(uri)) {
390 updateConstants();
391 } else if (ACTIVITY_STARTS_LOGGING_ENABLED_URI.equals(uri)) {
392 updateActivityStartsLoggingEnabled();
Michal Karpinski8596ded2018-11-14 14:43:48 +0000393 } else if (BACKGROUND_ACTIVITY_STARTS_ENABLED_URI.equals(uri)) {
Alan Stokesfb227072019-03-29 16:45:16 +0000394 updateBackgroundActivityStarts();
Kweku Adamsfa825632019-03-04 16:19:19 -0800395 } else if (ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS_URI.equals(uri)) {
396 updateEnableAutomaticSystemServerHeapDumps();
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100397 }
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800398 }
399
400 private void updateConstants() {
Makoto Onuki73360ab2017-03-17 11:50:13 -0700401 final String setting = Settings.Global.getString(mResolver,
402 Settings.Global.ACTIVITY_MANAGER_CONSTANTS);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800403 synchronized (mService) {
404 try {
Makoto Onuki73360ab2017-03-17 11:50:13 -0700405 mParser.setString(setting);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800406 } catch (IllegalArgumentException e) {
407 // Failed to parse the settings string, log this and move on
408 // with defaults.
409 Slog.e("ActivityManagerConstants", "Bad activity manager config settings", e);
410 }
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700411 BACKGROUND_SETTLE_TIME = mParser.getLong(KEY_BACKGROUND_SETTLE_TIME,
412 DEFAULT_BACKGROUND_SETTLE_TIME);
Dianne Hackborncb015632017-06-14 17:30:15 -0700413 FGSERVICE_MIN_SHOWN_TIME = mParser.getLong(KEY_FGSERVICE_MIN_SHOWN_TIME,
414 DEFAULT_FGSERVICE_MIN_SHOWN_TIME);
415 FGSERVICE_MIN_REPORT_TIME = mParser.getLong(KEY_FGSERVICE_MIN_REPORT_TIME,
416 DEFAULT_FGSERVICE_MIN_REPORT_TIME);
417 FGSERVICE_SCREEN_ON_BEFORE_TIME = mParser.getLong(KEY_FGSERVICE_SCREEN_ON_BEFORE_TIME,
418 DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME);
419 FGSERVICE_SCREEN_ON_AFTER_TIME = mParser.getLong(KEY_FGSERVICE_SCREEN_ON_AFTER_TIME,
420 DEFAULT_FGSERVICE_SCREEN_ON_AFTER_TIME);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700421 CONTENT_PROVIDER_RETAIN_TIME = mParser.getLong(KEY_CONTENT_PROVIDER_RETAIN_TIME,
422 DEFAULT_CONTENT_PROVIDER_RETAIN_TIME);
423 GC_TIMEOUT = mParser.getLong(KEY_GC_TIMEOUT,
424 DEFAULT_GC_TIMEOUT);
425 GC_MIN_INTERVAL = mParser.getLong(KEY_GC_MIN_INTERVAL,
426 DEFAULT_GC_MIN_INTERVAL);
427 FULL_PSS_MIN_INTERVAL = mParser.getLong(KEY_FULL_PSS_MIN_INTERVAL,
428 DEFAULT_FULL_PSS_MIN_INTERVAL);
429 FULL_PSS_LOWERED_INTERVAL = mParser.getLong(KEY_FULL_PSS_LOWERED_INTERVAL,
430 DEFAULT_FULL_PSS_LOWERED_INTERVAL);
Dianne Hackbornffca58b2017-05-24 16:15:45 -0700431 POWER_CHECK_INTERVAL = mParser.getLong(KEY_POWER_CHECK_INTERVAL,
432 DEFAULT_POWER_CHECK_INTERVAL);
433 POWER_CHECK_MAX_CPU_1 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_1,
434 DEFAULT_POWER_CHECK_MAX_CPU_1);
435 POWER_CHECK_MAX_CPU_2 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_2,
436 DEFAULT_POWER_CHECK_MAX_CPU_2);
437 POWER_CHECK_MAX_CPU_3 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_3,
438 DEFAULT_POWER_CHECK_MAX_CPU_3);
439 POWER_CHECK_MAX_CPU_4 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_4,
440 DEFAULT_POWER_CHECK_MAX_CPU_4);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700441 SERVICE_USAGE_INTERACTION_TIME = mParser.getLong(KEY_SERVICE_USAGE_INTERACTION_TIME,
442 DEFAULT_SERVICE_USAGE_INTERACTION_TIME);
443 USAGE_STATS_INTERACTION_INTERVAL = mParser.getLong(KEY_USAGE_STATS_INTERACTION_INTERVAL,
444 DEFAULT_USAGE_STATS_INTERACTION_INTERVAL);
445 SERVICE_RESTART_DURATION = mParser.getLong(KEY_SERVICE_RESTART_DURATION,
446 DEFAULT_SERVICE_RESTART_DURATION);
447 SERVICE_RESET_RUN_DURATION = mParser.getLong(KEY_SERVICE_RESET_RUN_DURATION,
448 DEFAULT_SERVICE_RESET_RUN_DURATION);
449 SERVICE_RESTART_DURATION_FACTOR = mParser.getInt(KEY_SERVICE_RESTART_DURATION_FACTOR,
450 DEFAULT_SERVICE_RESTART_DURATION_FACTOR);
451 SERVICE_MIN_RESTART_TIME_BETWEEN = mParser.getLong(KEY_SERVICE_MIN_RESTART_TIME_BETWEEN,
452 DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN);
453 MAX_SERVICE_INACTIVITY = mParser.getLong(KEY_MAX_SERVICE_INACTIVITY,
454 DEFAULT_MAX_SERVICE_INACTIVITY);
455 BG_START_TIMEOUT = mParser.getLong(KEY_BG_START_TIMEOUT,
456 DEFAULT_BG_START_TIMEOUT);
Michal Karpinskie069b002019-03-07 16:15:14 +0000457 SERVICE_BG_ACTIVITY_START_TIMEOUT = mParser.getLong(
458 KEY_SERVICE_BG_ACTIVITY_START_TIMEOUT,
459 DEFAULT_SERVICE_BG_ACTIVITY_START_TIMEOUT);
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700460 BOUND_SERVICE_CRASH_RESTART_DURATION = mParser.getLong(
461 KEY_BOUND_SERVICE_CRASH_RESTART_DURATION,
462 DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION);
463 BOUND_SERVICE_MAX_CRASH_RETRY = mParser.getInt(KEY_BOUND_SERVICE_CRASH_MAX_RETRY,
464 DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY);
Sudheer Shankaf6690102017-10-16 10:20:32 -0700465 FLAG_PROCESS_START_ASYNC = mParser.getBoolean(KEY_PROCESS_START_ASYNC,
466 DEFAULT_PROCESS_START_ASYNC);
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700467 MEMORY_INFO_THROTTLE_TIME = mParser.getLong(KEY_MEMORY_INFO_THROTTLE_TIME,
468 DEFAULT_MEMORY_INFO_THROTTLE_TIME);
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700469 TOP_TO_FGS_GRACE_DURATION = mParser.getDurationMillis(KEY_TOP_TO_FGS_GRACE_DURATION,
470 DEFAULT_TOP_TO_FGS_GRACE_DURATION);
Ben Murdochc26a5a82019-01-16 10:05:58 +0000471
472 // For new flags that are intended for server-side experiments, please use the new
473 // DeviceConfig package.
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700474
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800475 updateMaxCachedProcesses();
476 }
477 }
478
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100479 private void updateActivityStartsLoggingEnabled() {
480 mFlagActivityStartsLoggingEnabled = Settings.Global.getInt(mResolver,
Michal Karpinskib6394022019-02-26 11:24:34 +0000481 Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED, 1) == 1;
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100482 }
483
Alan Stokesfb227072019-03-29 16:45:16 +0000484 private void updateBackgroundActivityStarts() {
485 String whitelistedPackageNames = null;
486 int settingsValue = Settings.Global.getInt(mResolver,
487 Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, -1);
Michal Karpinski8596ded2018-11-14 14:43:48 +0000488
Alan Stokesfb227072019-03-29 16:45:16 +0000489 // If the user has explicitly enabled or disabled, that affects all apps.
490 // Otherwise we take the default state and whitelist from DeviceConfig.
491 if (settingsValue >= 0) {
492 mFlagBackgroundActivityStartsEnabled = settingsValue != 0;
493 } else {
494 boolean enabledInDeviceConfig = DeviceConfig.getBoolean(
495 DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
496 KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED,
497 /*defaultValue*/ true);
498 mFlagBackgroundActivityStartsEnabled = enabledInDeviceConfig;
499 if (!enabledInDeviceConfig) {
500 whitelistedPackageNames = DeviceConfig.getProperty(
501 DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
502 KEY_BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST);
503 }
Michal Karpinski666631b2019-02-26 16:59:11 +0000504 }
Alan Stokesfb227072019-03-29 16:45:16 +0000505 if (TextUtils.isEmpty(whitelistedPackageNames)) {
506 if (!mPackageNamesWhitelistedForBgActivityStarts.isEmpty()) {
507 mPackageNamesWhitelistedForBgActivityStarts = new ArraySet<>();
508 }
509 } else {
510 ArraySet<String> newSet = new ArraySet<>();
511 SimpleStringSplitter splitter = new SimpleStringSplitter(':');
512 splitter.setString(whitelistedPackageNames);
513 while (splitter.hasNext()) {
514 newSet.add(splitter.next());
515 }
516 mPackageNamesWhitelistedForBgActivityStarts = newSet;
Michal Karpinski666631b2019-02-26 16:59:11 +0000517 }
Michal Karpinski666631b2019-02-26 16:59:11 +0000518 }
519
Kweku Adamsfa825632019-03-04 16:19:19 -0800520 private void updateEnableAutomaticSystemServerHeapDumps() {
521 if (!mSystemServerAutomaticHeapDumpEnabled) {
522 Slog.wtf(TAG,
523 "updateEnableAutomaticSystemServerHeapDumps called when leak detection "
524 + "disabled");
525 return;
526 }
527 // Monitoring is on by default, so if the setting hasn't been set by the user,
528 // monitoring should be on.
529 final boolean enabled = Settings.Global.getInt(mResolver,
530 Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS, 1) == 1;
531
532 // Setting the threshold to 0 stops the checking.
533 final long threshold = enabled ? mSystemServerAutomaticHeapDumpPssThresholdBytes : 0;
534 mService.setDumpHeapDebugLimit(null, 0, threshold,
535 mSystemServerAutomaticHeapDumpPackageName);
536 }
537
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800538 private void updateMaxCachedProcesses() {
Ben Murdochc26a5a82019-01-16 10:05:58 +0000539 String maxCachedProcessesFlag = DeviceConfig.getProperty(
Matt Pape40074da2019-02-12 13:53:26 -0800540 DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MAX_CACHED_PROCESSES);
Ben Murdochc26a5a82019-01-16 10:05:58 +0000541 try {
542 CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0
543 ? (TextUtils.isEmpty(maxCachedProcessesFlag)
544 ? DEFAULT_MAX_CACHED_PROCESSES : Integer.parseInt(maxCachedProcessesFlag))
545 : mOverrideMaxCachedProcesses;
546 } catch (NumberFormatException e) {
547 // Bad flag value from Phenotype, revert to default.
Kweku Adamsfa825632019-03-04 16:19:19 -0800548 Slog.e(TAG,
Ben Murdochc26a5a82019-01-16 10:05:58 +0000549 "Unable to parse flag for max_cached_processes: " + maxCachedProcessesFlag, e);
550 CUR_MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
551 }
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800552 CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES);
553
554 // Note the trim levels do NOT depend on the override process limit, we want
555 // to consider the same level the point where we do trimming regardless of any
556 // additional enforced limit.
557 final int rawMaxEmptyProcesses = computeEmptyProcessLimit(MAX_CACHED_PROCESSES);
558 CUR_TRIM_EMPTY_PROCESSES = rawMaxEmptyProcesses/2;
559 CUR_TRIM_CACHED_PROCESSES = (MAX_CACHED_PROCESSES-rawMaxEmptyProcesses)/3;
560 }
561
562 void dump(PrintWriter pw) {
563 pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) "
564 + Settings.Global.ACTIVITY_MANAGER_CONSTANTS + ":");
565
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800566 pw.print(" "); pw.print(KEY_MAX_CACHED_PROCESSES); pw.print("=");
567 pw.println(MAX_CACHED_PROCESSES);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700568 pw.print(" "); pw.print(KEY_BACKGROUND_SETTLE_TIME); pw.print("=");
569 pw.println(BACKGROUND_SETTLE_TIME);
Dianne Hackborncb015632017-06-14 17:30:15 -0700570 pw.print(" "); pw.print(KEY_FGSERVICE_MIN_SHOWN_TIME); pw.print("=");
571 pw.println(FGSERVICE_MIN_SHOWN_TIME);
572 pw.print(" "); pw.print(KEY_FGSERVICE_MIN_REPORT_TIME); pw.print("=");
573 pw.println(FGSERVICE_MIN_REPORT_TIME);
574 pw.print(" "); pw.print(KEY_FGSERVICE_SCREEN_ON_BEFORE_TIME); pw.print("=");
575 pw.println(FGSERVICE_SCREEN_ON_BEFORE_TIME);
576 pw.print(" "); pw.print(KEY_FGSERVICE_SCREEN_ON_AFTER_TIME); pw.print("=");
577 pw.println(FGSERVICE_SCREEN_ON_AFTER_TIME);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700578 pw.print(" "); pw.print(KEY_CONTENT_PROVIDER_RETAIN_TIME); pw.print("=");
579 pw.println(CONTENT_PROVIDER_RETAIN_TIME);
580 pw.print(" "); pw.print(KEY_GC_TIMEOUT); pw.print("=");
581 pw.println(GC_TIMEOUT);
582 pw.print(" "); pw.print(KEY_GC_MIN_INTERVAL); pw.print("=");
583 pw.println(GC_MIN_INTERVAL);
584 pw.print(" "); pw.print(KEY_FULL_PSS_MIN_INTERVAL); pw.print("=");
585 pw.println(FULL_PSS_MIN_INTERVAL);
586 pw.print(" "); pw.print(KEY_FULL_PSS_LOWERED_INTERVAL); pw.print("=");
587 pw.println(FULL_PSS_LOWERED_INTERVAL);
Dianne Hackbornffca58b2017-05-24 16:15:45 -0700588 pw.print(" "); pw.print(KEY_POWER_CHECK_INTERVAL); pw.print("=");
589 pw.println(POWER_CHECK_INTERVAL);
590 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_1); pw.print("=");
591 pw.println(POWER_CHECK_MAX_CPU_1);
592 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_2); pw.print("=");
593 pw.println(POWER_CHECK_MAX_CPU_2);
594 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_3); pw.print("=");
595 pw.println(POWER_CHECK_MAX_CPU_3);
596 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_4); pw.print("=");
597 pw.println(POWER_CHECK_MAX_CPU_4);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700598 pw.print(" "); pw.print(KEY_SERVICE_USAGE_INTERACTION_TIME); pw.print("=");
599 pw.println(SERVICE_USAGE_INTERACTION_TIME);
600 pw.print(" "); pw.print(KEY_USAGE_STATS_INTERACTION_INTERVAL); pw.print("=");
601 pw.println(USAGE_STATS_INTERACTION_INTERVAL);
602 pw.print(" "); pw.print(KEY_SERVICE_RESTART_DURATION); pw.print("=");
603 pw.println(SERVICE_RESTART_DURATION);
604 pw.print(" "); pw.print(KEY_SERVICE_RESET_RUN_DURATION); pw.print("=");
605 pw.println(SERVICE_RESET_RUN_DURATION);
606 pw.print(" "); pw.print(KEY_SERVICE_RESTART_DURATION_FACTOR); pw.print("=");
607 pw.println(SERVICE_RESTART_DURATION_FACTOR);
608 pw.print(" "); pw.print(KEY_SERVICE_MIN_RESTART_TIME_BETWEEN); pw.print("=");
609 pw.println(SERVICE_MIN_RESTART_TIME_BETWEEN);
610 pw.print(" "); pw.print(KEY_MAX_SERVICE_INACTIVITY); pw.print("=");
611 pw.println(MAX_SERVICE_INACTIVITY);
612 pw.print(" "); pw.print(KEY_BG_START_TIMEOUT); pw.print("=");
613 pw.println(BG_START_TIMEOUT);
Michal Karpinskie069b002019-03-07 16:15:14 +0000614 pw.print(" "); pw.print(KEY_SERVICE_BG_ACTIVITY_START_TIMEOUT); pw.print("=");
615 pw.println(SERVICE_BG_ACTIVITY_START_TIMEOUT);
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700616 pw.print(" "); pw.print(KEY_BOUND_SERVICE_CRASH_RESTART_DURATION); pw.print("=");
617 pw.println(BOUND_SERVICE_CRASH_RESTART_DURATION);
618 pw.print(" "); pw.print(KEY_BOUND_SERVICE_CRASH_MAX_RETRY); pw.print("=");
619 pw.println(BOUND_SERVICE_MAX_CRASH_RETRY);
620 pw.print(" "); pw.print(KEY_PROCESS_START_ASYNC); pw.print("=");
621 pw.println(FLAG_PROCESS_START_ASYNC);
622 pw.print(" "); pw.print(KEY_MEMORY_INFO_THROTTLE_TIME); pw.print("=");
623 pw.println(MEMORY_INFO_THROTTLE_TIME);
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700624 pw.print(" "); pw.print(KEY_TOP_TO_FGS_GRACE_DURATION); pw.print("=");
625 pw.println(TOP_TO_FGS_GRACE_DURATION);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800626
627 pw.println();
628 if (mOverrideMaxCachedProcesses >= 0) {
629 pw.print(" mOverrideMaxCachedProcesses="); pw.println(mOverrideMaxCachedProcesses);
630 }
631 pw.print(" CUR_MAX_CACHED_PROCESSES="); pw.println(CUR_MAX_CACHED_PROCESSES);
632 pw.print(" CUR_MAX_EMPTY_PROCESSES="); pw.println(CUR_MAX_EMPTY_PROCESSES);
633 pw.print(" CUR_TRIM_EMPTY_PROCESSES="); pw.println(CUR_TRIM_EMPTY_PROCESSES);
634 pw.print(" CUR_TRIM_CACHED_PROCESSES="); pw.println(CUR_TRIM_CACHED_PROCESSES);
635 }
636}