|
120 | 120 |
|
121 | 121 | import java.io.BufferedInputStream; |
122 | 122 | import java.io.BufferedOutputStream; |
| 123 | +import java.io.BufferedReader; |
123 | 124 | import java.io.DataInputStream; |
124 | 125 | import java.io.DataOutputStream; |
125 | 126 | import java.io.File; |
|
128 | 129 | import java.io.FileNotFoundException; |
129 | 130 | import java.io.FileOutputStream; |
130 | 131 | import java.io.IOException; |
| 132 | +import java.io.InputStream; |
131 | 133 | import java.io.InputStreamReader; |
132 | 134 | import java.io.PrintWriter; |
| 135 | +import java.io.StringWriter; |
133 | 136 | import java.lang.IllegalStateException; |
134 | 137 | import java.lang.ref.WeakReference; |
135 | 138 | import java.util.ArrayList; |
@@ -857,9 +860,11 @@ public void binderDied() { |
857 | 860 | static final int SHOW_COMPAT_MODE_DIALOG_MSG = 30; |
858 | 861 | static final int DISPATCH_FOREGROUND_ACTIVITIES_CHANGED = 31; |
859 | 862 | static final int DISPATCH_PROCESS_DIED = 32; |
| 863 | + static final int REPORT_MEM_USAGE = 33; |
860 | 864 |
|
861 | 865 | AlertDialog mUidAlert; |
862 | 866 | CompatModeDialog mCompatModeDialog; |
| 867 | + long mLastMemUsageReportTime = 0; |
863 | 868 |
|
864 | 869 | final Handler mHandler = new Handler() { |
865 | 870 | //public Handler() { |
@@ -1199,6 +1204,56 @@ public void handleMessage(Message msg) { |
1199 | 1204 | dispatchProcessDied(pid, uid); |
1200 | 1205 | break; |
1201 | 1206 | } |
| 1207 | + case REPORT_MEM_USAGE: { |
| 1208 | + boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0")); |
| 1209 | + if (!isDebuggable) { |
| 1210 | + return; |
| 1211 | + } |
| 1212 | + synchronized (ActivityManagerService.this) { |
| 1213 | + long now = SystemClock.uptimeMillis(); |
| 1214 | + if (now < (mLastMemUsageReportTime+10000)) { |
| 1215 | + // Don't report more than every 10 seconds to somewhat |
| 1216 | + // avoid spamming. |
| 1217 | + return; |
| 1218 | + } |
| 1219 | + mLastMemUsageReportTime = now; |
| 1220 | + } |
| 1221 | + Thread thread = new Thread() { |
| 1222 | + @Override public void run() { |
| 1223 | + try { |
| 1224 | + java.lang.Process proc = Runtime.getRuntime().exec(new String[] { |
| 1225 | + "procrank", }); |
| 1226 | + final InputStreamReader converter = new InputStreamReader( |
| 1227 | + proc.getInputStream()); |
| 1228 | + BufferedReader in = new BufferedReader(converter); |
| 1229 | + String line; |
| 1230 | + while (true) { |
| 1231 | + line = in.readLine(); |
| 1232 | + if (line == null) { |
| 1233 | + break; |
| 1234 | + } |
| 1235 | + if (line.length() > 0) { |
| 1236 | + Slog.i(TAG, line); |
| 1237 | + } |
| 1238 | + } |
| 1239 | + converter.close(); |
| 1240 | + } catch (IOException e) { |
| 1241 | + } |
| 1242 | + StringWriter sw = new StringWriter(); |
| 1243 | + PrintWriter pw = new PrintWriter(sw); |
| 1244 | + dumpApplicationMemoryUsage(null, pw, " ", new String[] { }, true); |
| 1245 | + Slog.i(TAG, sw.toString()); |
| 1246 | + synchronized (ActivityManagerService.this) { |
| 1247 | + long now = SystemClock.uptimeMillis(); |
| 1248 | + if (mLastMemUsageReportTime < now) { |
| 1249 | + mLastMemUsageReportTime = now; |
| 1250 | + } |
| 1251 | + } |
| 1252 | + } |
| 1253 | + }; |
| 1254 | + thread.start(); |
| 1255 | + break; |
| 1256 | + } |
1202 | 1257 | } |
1203 | 1258 | } |
1204 | 1259 | }; |
@@ -1339,7 +1394,7 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { |
1339 | 1394 | return; |
1340 | 1395 | } |
1341 | 1396 |
|
1342 | | - mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args); |
| 1397 | + mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args, false); |
1343 | 1398 | } |
1344 | 1399 | } |
1345 | 1400 |
|
@@ -2768,6 +2823,7 @@ final void appDiedLocked(ProcessRecord app, int pid, |
2768 | 2823 | addProcessToGcListLocked(rec); |
2769 | 2824 | } |
2770 | 2825 | } |
| 2826 | + mHandler.sendEmptyMessage(REPORT_MEM_USAGE); |
2771 | 2827 | scheduleAppGcsLocked(); |
2772 | 2828 | } |
2773 | 2829 | } |
@@ -9242,7 +9298,7 @@ public int compare(MemItem lhs, MemItem rhs) { |
9242 | 9298 | } |
9243 | 9299 |
|
9244 | 9300 | final void dumpApplicationMemoryUsage(FileDescriptor fd, |
9245 | | - PrintWriter pw, String prefix, String[] args) { |
| 9301 | + PrintWriter pw, String prefix, String[] args, boolean brief) { |
9246 | 9302 | boolean dumpAll = false; |
9247 | 9303 |
|
9248 | 9304 | int opti = 0; |
@@ -9382,15 +9438,19 @@ final void dumpApplicationMemoryUsage(FileDescriptor fd, |
9382 | 9438 | } |
9383 | 9439 | } |
9384 | 9440 |
|
9385 | | - pw.println(); |
9386 | | - pw.println("Total PSS by process:"); |
9387 | | - dumpMemItems(pw, " ", procMems, true); |
9388 | | - pw.println(); |
| 9441 | + if (!brief) { |
| 9442 | + pw.println(); |
| 9443 | + pw.println("Total PSS by process:"); |
| 9444 | + dumpMemItems(pw, " ", procMems, true); |
| 9445 | + pw.println(); |
| 9446 | + } |
9389 | 9447 | pw.println("Total PSS by OOM adjustment:"); |
9390 | 9448 | dumpMemItems(pw, " ", oomMems, false); |
9391 | | - pw.println(); |
9392 | | - pw.println("Total PSS by category:"); |
9393 | | - dumpMemItems(pw, " ", catMems, true); |
| 9449 | + if (!brief) { |
| 9450 | + pw.println(); |
| 9451 | + pw.println("Total PSS by category:"); |
| 9452 | + dumpMemItems(pw, " ", catMems, true); |
| 9453 | + } |
9394 | 9454 | pw.println(); |
9395 | 9455 | pw.print("Total PSS: "); pw.print(totalPss); pw.println(" Kb"); |
9396 | 9456 | } |
|
0 commit comments