Skip to content

Commit 04d6db3

Browse files
author
Dianne Hackborn
committed
Print out memory info when we get into a low memory situation.
Change-Id: I2c8b8847a0f38135d8bf9ff9b7198517c3b0262e
1 parent e4ca924 commit 04d6db3

File tree

1 file changed

+69
-9
lines changed

1 file changed

+69
-9
lines changed

services/java/com/android/server/am/ActivityManagerService.java

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120

121121
import java.io.BufferedInputStream;
122122
import java.io.BufferedOutputStream;
123+
import java.io.BufferedReader;
123124
import java.io.DataInputStream;
124125
import java.io.DataOutputStream;
125126
import java.io.File;
@@ -128,8 +129,10 @@
128129
import java.io.FileNotFoundException;
129130
import java.io.FileOutputStream;
130131
import java.io.IOException;
132+
import java.io.InputStream;
131133
import java.io.InputStreamReader;
132134
import java.io.PrintWriter;
135+
import java.io.StringWriter;
133136
import java.lang.IllegalStateException;
134137
import java.lang.ref.WeakReference;
135138
import java.util.ArrayList;
@@ -844,9 +847,11 @@ public void binderDied() {
844847
static final int SHOW_COMPAT_MODE_DIALOG_MSG = 30;
845848
static final int DISPATCH_FOREGROUND_ACTIVITIES_CHANGED = 31;
846849
static final int DISPATCH_PROCESS_DIED = 32;
850+
static final int REPORT_MEM_USAGE = 33;
847851

848852
AlertDialog mUidAlert;
849853
CompatModeDialog mCompatModeDialog;
854+
long mLastMemUsageReportTime = 0;
850855

851856
final Handler mHandler = new Handler() {
852857
//public Handler() {
@@ -1186,6 +1191,56 @@ public void handleMessage(Message msg) {
11861191
dispatchProcessDied(pid, uid);
11871192
break;
11881193
}
1194+
case REPORT_MEM_USAGE: {
1195+
boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
1196+
if (!isDebuggable) {
1197+
return;
1198+
}
1199+
synchronized (ActivityManagerService.this) {
1200+
long now = SystemClock.uptimeMillis();
1201+
if (now < (mLastMemUsageReportTime+10000)) {
1202+
// Don't report more than every 10 seconds to somewhat
1203+
// avoid spamming.
1204+
return;
1205+
}
1206+
mLastMemUsageReportTime = now;
1207+
}
1208+
Thread thread = new Thread() {
1209+
@Override public void run() {
1210+
try {
1211+
java.lang.Process proc = Runtime.getRuntime().exec(new String[] {
1212+
"procrank", });
1213+
final InputStreamReader converter = new InputStreamReader(
1214+
proc.getInputStream());
1215+
BufferedReader in = new BufferedReader(converter);
1216+
String line;
1217+
while (true) {
1218+
line = in.readLine();
1219+
if (line == null) {
1220+
break;
1221+
}
1222+
if (line.length() > 0) {
1223+
Slog.i(TAG, line);
1224+
}
1225+
}
1226+
converter.close();
1227+
} catch (IOException e) {
1228+
}
1229+
StringWriter sw = new StringWriter();
1230+
PrintWriter pw = new PrintWriter(sw);
1231+
dumpApplicationMemoryUsage(null, pw, " ", new String[] { }, true);
1232+
Slog.i(TAG, sw.toString());
1233+
synchronized (ActivityManagerService.this) {
1234+
long now = SystemClock.uptimeMillis();
1235+
if (mLastMemUsageReportTime < now) {
1236+
mLastMemUsageReportTime = now;
1237+
}
1238+
}
1239+
}
1240+
};
1241+
thread.start();
1242+
break;
1243+
}
11891244
}
11901245
}
11911246
};
@@ -1326,7 +1381,7 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
13261381
return;
13271382
}
13281383

1329-
mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args);
1384+
mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args, false);
13301385
}
13311386
}
13321387

@@ -2755,6 +2810,7 @@ final void appDiedLocked(ProcessRecord app, int pid,
27552810
addProcessToGcListLocked(rec);
27562811
}
27572812
}
2813+
mHandler.sendEmptyMessage(REPORT_MEM_USAGE);
27582814
scheduleAppGcsLocked();
27592815
}
27602816
}
@@ -9216,7 +9272,7 @@ public int compare(MemItem lhs, MemItem rhs) {
92169272
}
92179273

92189274
final void dumpApplicationMemoryUsage(FileDescriptor fd,
9219-
PrintWriter pw, String prefix, String[] args) {
9275+
PrintWriter pw, String prefix, String[] args, boolean brief) {
92209276
boolean dumpAll = false;
92219277

92229278
int opti = 0;
@@ -9354,15 +9410,19 @@ final void dumpApplicationMemoryUsage(FileDescriptor fd,
93549410
}
93559411
}
93569412

9357-
pw.println();
9358-
pw.println("Total PSS by process:");
9359-
dumpMemItems(pw, " ", procMems, true);
9360-
pw.println();
9413+
if (!brief) {
9414+
pw.println();
9415+
pw.println("Total PSS by process:");
9416+
dumpMemItems(pw, " ", procMems, true);
9417+
pw.println();
9418+
}
93619419
pw.println("Total PSS by OOM adjustment:");
93629420
dumpMemItems(pw, " ", oomMems, false);
9363-
pw.println();
9364-
pw.println("Total PSS by category:");
9365-
dumpMemItems(pw, " ", catMems, true);
9421+
if (!brief) {
9422+
pw.println();
9423+
pw.println("Total PSS by category:");
9424+
dumpMemItems(pw, " ", catMems, true);
9425+
}
93669426
pw.println();
93679427
pw.print("Total PSS: "); pw.print(totalPss); pw.println(" Kb");
93689428
}

0 commit comments

Comments
 (0)