summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityThread.java135
-rw-r--r--core/java/android/os/Debug.java62
-rw-r--r--core/proto/android/server/activitymanagerservice.proto18
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java217
4 files changed, 325 insertions, 107 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 50f945b095cb..553ef69fe8e2 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2492,13 +2492,15 @@ public final class ActivityThread extends ClientTransactionHandler {
}
}
- private static final String HEAP_FULL_COLUMN
- = "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
- private static final String HEAP_COLUMN
- = "%13s %8s %8s %8s %8s %8s %8s %8s";
+ private static final String HEAP_FULL_COLUMN =
+ "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
+ private static final String HEAP_COLUMN =
+ "%13s %8s %8s %8s %8s %8s %8s %8s %8s";
private static final String ONE_COUNT_COLUMN = "%21s %8d";
private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d";
- private static final String ONE_COUNT_COLUMN_HEADER = "%21s %8s";
+ private static final String THREE_COUNT_COLUMNS = "%21s %8d %21s %8s %21s %8d";
+ private static final String TWO_COUNT_COLUMN_HEADER = "%21s %8s %21s %8s";
+ private static final String ONE_ALT_COUNT_COLUMN = "%21s %8s %21s %8d";
// Formatting for checkin service - update version if row format changes
private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 4;
@@ -2619,43 +2621,43 @@ public final class ActivityThread extends ClientTransactionHandler {
if (dumpFullInfo) {
printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private",
"Shared", "Private", memInfo.hasSwappedOutPss ? "SwapPss" : "Swap",
- "Heap", "Heap", "Heap");
+ "Rss", "Heap", "Heap", "Heap");
printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty",
- "Clean", "Clean", "Dirty",
+ "Clean", "Clean", "Dirty", "Total",
"Size", "Alloc", "Free");
printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------",
- "------", "------", "------", "------", "------", "------");
+ "------", "------", "------", "------", "------", "------", "------");
printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss,
memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
memInfo.nativePrivateClean, memInfo.hasSwappedOutPss ?
memInfo.nativeSwappedOutPss : memInfo.nativeSwappedOut,
- nativeMax, nativeAllocated, nativeFree);
+ memInfo.nativeRss, nativeMax, nativeAllocated, nativeFree);
printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
memInfo.dalvikPrivateClean, memInfo.hasSwappedOutPss ?
memInfo.dalvikSwappedOutPss : memInfo.dalvikSwappedOut,
- dalvikMax, dalvikAllocated, dalvikFree);
+ memInfo.dalvikRss, dalvikMax, dalvikAllocated, dalvikFree);
} else {
printRow(pw, HEAP_COLUMN, "", "Pss", "Private",
"Private", memInfo.hasSwappedOutPss ? "SwapPss" : "Swap",
- "Heap", "Heap", "Heap");
+ "Rss", "Heap", "Heap", "Heap");
printRow(pw, HEAP_COLUMN, "", "Total", "Dirty",
- "Clean", "Dirty", "Size", "Alloc", "Free");
+ "Clean", "Dirty", "Total", "Size", "Alloc", "Free");
printRow(pw, HEAP_COLUMN, "", "------", "------", "------",
- "------", "------", "------", "------", "------");
+ "------", "------", "------", "------", "------", "------");
printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss,
memInfo.nativePrivateDirty,
memInfo.nativePrivateClean,
memInfo.hasSwappedOutPss ? memInfo.nativeSwappedOutPss :
- memInfo.nativeSwappedOut,
+ memInfo.nativeSwappedOut, memInfo.nativeRss,
nativeMax, nativeAllocated, nativeFree);
printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
memInfo.dalvikPrivateDirty,
memInfo.dalvikPrivateClean,
memInfo.hasSwappedOutPss ? memInfo.dalvikSwappedOutPss :
- memInfo.dalvikSwappedOut,
+ memInfo.dalvikSwappedOut, memInfo.dalvikRss,
dalvikMax, dalvikAllocated, dalvikFree);
}
@@ -2667,6 +2669,7 @@ public final class ActivityThread extends ClientTransactionHandler {
int otherPrivateClean = memInfo.otherPrivateClean;
int otherSwappedOut = memInfo.otherSwappedOut;
int otherSwappedOutPss = memInfo.otherSwappedOutPss;
+ int otherRss = memInfo.otherRss;
for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
final int myPss = memInfo.getOtherPss(i);
@@ -2677,21 +2680,22 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
- || mySharedClean != 0 || myPrivateClean != 0
+ || mySharedClean != 0 || myPrivateClean != 0 || myRss != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
if (dumpFullInfo) {
printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
} else {
printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
myPss, myPrivateDirty,
myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
}
otherPss -= myPss;
otherSwappablePss -= mySwappablePss;
@@ -2701,6 +2705,7 @@ public final class ActivityThread extends ClientTransactionHandler {
otherPrivateClean -= myPrivateClean;
otherSwappedOut -= mySwappedOut;
otherSwappedOutPss -= mySwappedOutPss;
+ otherRss -= myRss;
}
}
@@ -2708,25 +2713,25 @@ public final class ActivityThread extends ClientTransactionHandler {
printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss,
otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
memInfo.hasSwappedOutPss ? otherSwappedOutPss : otherSwappedOut,
- "", "", "");
+ otherRss, "", "", "");
printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(),
memInfo.getTotalSwappablePss(),
memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
memInfo.hasSwappedOutPss ? memInfo.getTotalSwappedOutPss() :
- memInfo.getTotalSwappedOut(),
+ memInfo.getTotalSwappedOut(), memInfo.getTotalRss(),
nativeMax+dalvikMax, nativeAllocated+dalvikAllocated,
nativeFree+dalvikFree);
} else {
printRow(pw, HEAP_COLUMN, "Unknown", otherPss,
otherPrivateDirty, otherPrivateClean,
memInfo.hasSwappedOutPss ? otherSwappedOutPss : otherSwappedOut,
- "", "", "");
+ otherRss, "", "", "");
printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(),
memInfo.getTotalPrivateDirty(),
memInfo.getTotalPrivateClean(),
memInfo.hasSwappedOutPss ? memInfo.getTotalSwappedOutPss() :
- memInfo.getTotalSwappedOut(),
+ memInfo.getTotalSwappedOut(), memInfo.getTotalPss(),
nativeMax+dalvikMax,
nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
}
@@ -2745,6 +2750,7 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
|| mySharedClean != 0 || myPrivateClean != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
@@ -2753,13 +2759,13 @@ public final class ActivityThread extends ClientTransactionHandler {
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
} else {
printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
myPss, myPrivateDirty,
myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
}
}
}
@@ -2768,31 +2774,36 @@ public final class ActivityThread extends ClientTransactionHandler {
pw.println(" ");
pw.println(" App Summary");
- printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "Pss(KB)");
- printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "------");
- printRow(pw, ONE_COUNT_COLUMN,
- "Java Heap:", memInfo.getSummaryJavaHeap());
+ printRow(pw, TWO_COUNT_COLUMN_HEADER, "", "Pss(KB)", "", "Rss(KB)");
+ printRow(pw, TWO_COUNT_COLUMN_HEADER, "", "------", "", "------");
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Java Heap:", memInfo.getSummaryJavaHeap(), "", memInfo.getSummaryJavaHeapRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Native Heap:", memInfo.getSummaryNativeHeap(), "",
+ memInfo.getSummaryNativeHeapRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Code:", memInfo.getSummaryCode(), "", memInfo.getSummaryCodeRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Stack:", memInfo.getSummaryStack(), "", memInfo.getSummaryStackRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Graphics:", memInfo.getSummaryGraphics(), "", memInfo.getSummaryGraphicsRss());
printRow(pw, ONE_COUNT_COLUMN,
- "Native Heap:", memInfo.getSummaryNativeHeap());
+ "Private Other:", memInfo.getSummaryPrivateOther());
printRow(pw, ONE_COUNT_COLUMN,
- "Code:", memInfo.getSummaryCode());
- printRow(pw, ONE_COUNT_COLUMN,
- "Stack:", memInfo.getSummaryStack());
- printRow(pw, ONE_COUNT_COLUMN,
- "Graphics:", memInfo.getSummaryGraphics());
- printRow(pw, ONE_COUNT_COLUMN,
- "Private Other:", memInfo.getSummaryPrivateOther());
- printRow(pw, ONE_COUNT_COLUMN,
- "System:", memInfo.getSummarySystem());
+ "System:", memInfo.getSummarySystem());
+ printRow(pw, ONE_ALT_COUNT_COLUMN,
+ "Unknown:", "", "", memInfo.getSummaryUnknownRss());
pw.println(" ");
if (memInfo.hasSwappedOutPss) {
- printRow(pw, TWO_COUNT_COLUMNS,
- "TOTAL:", memInfo.getSummaryTotalPss(),
- "TOTAL SWAP PSS:", memInfo.getSummaryTotalSwapPss());
+ printRow(pw, THREE_COUNT_COLUMNS,
+ "TOTAL PSS:", memInfo.getSummaryTotalPss(),
+ "TOTAL RSS:", memInfo.getTotalRss(),
+ "TOTAL SWAP PSS:", memInfo.getSummaryTotalSwapPss());
} else {
- printRow(pw, TWO_COUNT_COLUMNS,
- "TOTAL:", memInfo.getSummaryTotalPss(),
- "TOTAL SWAP (KB):", memInfo.getSummaryTotalSwap());
+ printRow(pw, THREE_COUNT_COLUMNS,
+ "TOTAL PSS:", memInfo.getSummaryTotalPss(),
+ "TOTAL RSS:", memInfo.getTotalRss(),
+ "TOTAL SWAP (KB):", memInfo.getSummaryTotalSwap());
}
}
@@ -2804,7 +2815,7 @@ public final class ActivityThread extends ClientTransactionHandler {
private static void dumpMemoryInfo(ProtoOutputStream proto, long fieldId, String name,
int pss, int cleanPss, int sharedDirty, int privateDirty,
int sharedClean, int privateClean,
- boolean hasSwappedOutPss, int dirtySwap, int dirtySwapPss) {
+ boolean hasSwappedOutPss, int dirtySwap, int dirtySwapPss, int rss) {
final long token = proto.start(fieldId);
proto.write(MemInfoDumpProto.ProcessMemory.MemoryInfo.NAME, name);
@@ -2819,6 +2830,7 @@ public final class ActivityThread extends ClientTransactionHandler {
} else {
proto.write(MemInfoDumpProto.ProcessMemory.MemoryInfo.DIRTY_SWAP_KB, dirtySwap);
}
+ proto.write(MemInfoDumpProto.ProcessMemory.MemoryInfo.TOTAL_RSS_KB, rss);
proto.end(token);
}
@@ -2837,7 +2849,8 @@ public final class ActivityThread extends ClientTransactionHandler {
memInfo.nativePss, memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
memInfo.nativePrivateClean, memInfo.hasSwappedOutPss,
- memInfo.nativeSwappedOut, memInfo.nativeSwappedOutPss);
+ memInfo.nativeSwappedOut, memInfo.nativeSwappedOutPss,
+ memInfo.nativeRss);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_SIZE_KB, nativeMax);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_ALLOC_KB, nativeAllocated);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_FREE_KB, nativeFree);
@@ -2848,7 +2861,8 @@ public final class ActivityThread extends ClientTransactionHandler {
memInfo.dalvikPss, memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
memInfo.dalvikPrivateClean, memInfo.hasSwappedOutPss,
- memInfo.dalvikSwappedOut, memInfo.dalvikSwappedOutPss);
+ memInfo.dalvikSwappedOut, memInfo.dalvikSwappedOutPss,
+ memInfo.dalvikRss);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_SIZE_KB, dalvikMax);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_ALLOC_KB, dalvikAllocated);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_FREE_KB, dalvikFree);
@@ -2862,6 +2876,7 @@ public final class ActivityThread extends ClientTransactionHandler {
int otherPrivateClean = memInfo.otherPrivateClean;
int otherSwappedOut = memInfo.otherSwappedOut;
int otherSwappedOutPss = memInfo.otherSwappedOutPss;
+ int otherRss = memInfo.otherRss;
for (int i = 0; i < Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
final int myPss = memInfo.getOtherPss(i);
@@ -2872,14 +2887,15 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
- || mySharedClean != 0 || myPrivateClean != 0
+ || mySharedClean != 0 || myPrivateClean != 0 || myRss != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
dumpMemoryInfo(proto, MemInfoDumpProto.ProcessMemory.OTHER_HEAPS,
Debug.MemoryInfo.getOtherLabel(i),
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
- memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss);
+ memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss, myRss);
otherPss -= myPss;
otherSwappablePss -= mySwappablePss;
@@ -2889,20 +2905,21 @@ public final class ActivityThread extends ClientTransactionHandler {
otherPrivateClean -= myPrivateClean;
otherSwappedOut -= mySwappedOut;
otherSwappedOutPss -= mySwappedOutPss;
+ otherRss -= myRss;
}
}
dumpMemoryInfo(proto, MemInfoDumpProto.ProcessMemory.UNKNOWN_HEAP, "Unknown",
otherPss, otherSwappablePss,
otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
- memInfo.hasSwappedOutPss, otherSwappedOut, otherSwappedOutPss);
+ memInfo.hasSwappedOutPss, otherSwappedOut, otherSwappedOutPss, otherRss);
final long tToken = proto.start(MemInfoDumpProto.ProcessMemory.TOTAL_HEAP);
dumpMemoryInfo(proto, MemInfoDumpProto.ProcessMemory.HeapInfo.MEM_INFO, "TOTAL",
memInfo.getTotalPss(), memInfo.getTotalSwappablePss(),
memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
memInfo.hasSwappedOutPss, memInfo.getTotalSwappedOut(),
- memInfo.getTotalSwappedOutPss());
+ memInfo.getTotalSwappedOutPss(), memInfo.getTotalRss());
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_SIZE_KB,
nativeMax + dalvikMax);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_ALLOC_KB,
@@ -2923,6 +2940,7 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
|| mySharedClean != 0 || myPrivateClean != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
@@ -2930,7 +2948,7 @@ public final class ActivityThread extends ClientTransactionHandler {
Debug.MemoryInfo.getOtherLabel(i),
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
- memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss);
+ memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss, myRss);
}
}
}
@@ -2958,6 +2976,19 @@ public final class ActivityThread extends ClientTransactionHandler {
proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.TOTAL_SWAP_PSS,
memInfo.getSummaryTotalSwap());
}
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.JAVA_HEAP_RSS_KB,
+ memInfo.getSummaryJavaHeapRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.NATIVE_HEAP_RSS_KB,
+ memInfo.getSummaryNativeHeapRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.CODE_RSS_KB,
+ memInfo.getSummaryCodeRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.STACK_RSS_KB,
+ memInfo.getSummaryStackRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.GRAPHICS_RSS_KB,
+ memInfo.getSummaryGraphicsRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.UNKNOWN_RSS_KB,
+ memInfo.getSummaryUnknownRss());
+
proto.end(asToken);
}
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 1213eeaa747d..3cc28197503a 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -787,6 +787,68 @@ public final class Debug
}
/**
+ * Rss of Java Heap bytes in KB due to the application.
+ * @hide
+ */
+ public int getSummaryJavaHeapRss() {
+ return dalvikRss + getOtherRss(OTHER_ART);
+ }
+
+ /**
+ * Rss of Native Heap bytes in KB due to the application.
+ * @hide
+ */
+ public int getSummaryNativeHeapRss() {
+ return nativeRss;
+ }
+
+ /**
+ * Rss of code and other static resource bytes in KB due to
+ * the application.
+ * @hide
+ */
+ public int getSummaryCodeRss() {
+ return getOtherRss(OTHER_SO)
+ + getOtherRss(OTHER_JAR)
+ + getOtherRss(OTHER_APK)
+ + getOtherRss(OTHER_TTF)
+ + getOtherRss(OTHER_DEX)
+ + getOtherRss(OTHER_OAT);
+ }
+
+ /**
+ * Rss in KB of the stack due to the application.
+ * @hide
+ */
+ public int getSummaryStackRss() {
+ return getOtherRss(OTHER_STACK);
+ }
+
+ /**
+ * Rss in KB of graphics due to the application.
+ * @hide
+ */
+ public int getSummaryGraphicsRss() {
+ return getOtherRss(OTHER_GL_DEV)
+ + getOtherRss(OTHER_GRAPHICS)
+ + getOtherRss(OTHER_GL);
+ }
+
+ /**
+ * Rss in KB due to either the application or system that haven't otherwise been
+ * accounted for.
+ * @hide
+ */
+ public int getSummaryUnknownRss() {
+ return getTotalRss()
+ - getSummaryJavaHeapRss()
+ - getSummaryNativeHeapRss()
+ - getSummaryCodeRss()
+ - getSummaryStackRss()
+ - getSummaryGraphicsRss();
+ }
+
+ /**
* Total Pss in KB.
* @hide
*/
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 7fb6f98ab662..a1ff9b94123f 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -261,6 +261,8 @@ message MemInfoDumpProto {
// The dirty the pages that have been swapped out, proportional.
int32 dirty_swap_pss_kb = 9;
}
+ // The rss set size for the heap.
+ optional int32 total_rss_kb = 10;
}
message HeapInfo {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -294,6 +296,12 @@ message MemInfoDumpProto {
int32 total_swap_pss = 8;
int32 total_swap_kb = 9;
}
+ optional int32 java_heap_rss_kb = 10;
+ optional int32 native_heap_rss_kb = 11;
+ optional int32 code_rss_kb = 12;
+ optional int32 stack_rss_kb = 13;
+ optional int32 graphics_rss_kb = 14;
+ optional int32 unknown_rss_kb = 15;
}
optional AppSummary app_summary = 9;
}
@@ -359,10 +367,16 @@ message MemInfoDumpProto {
optional int32 id = 3;
optional bool is_proc = 4;
optional bool has_activities = 5;
- optional int64 pss_kb = 6;
+ oneof ss_kb {
+ int64 pss_kb = 6;
+ int64 rss_kb = 9;
+ }
optional int64 swap_pss_kb = 7;
repeated MemItem sub_items = 8;
}
+ repeated MemItem total_rss_by_process = 29;
+ repeated MemItem total_rss_by_oom_adjustment = 30;
+ repeated MemItem total_rss_by_category = 31;
repeated MemItem total_pss_by_process = 5;
repeated MemItem total_pss_by_oom_adjustment = 6;
repeated MemItem total_pss_by_category = 7;
@@ -414,6 +428,8 @@ message MemInfoDumpProto {
optional bool is_low_ram_device = 27;
optional bool is_high_end_gfx = 28;
+
+ // Next Tag: 32
}
message StickyBroadcastProto {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7b20e5599bad..ede573a64c65 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12109,39 +12109,44 @@ public class ActivityManagerService extends IActivityManager.Stub
final String shortLabel;
final long pss;
final long swapPss;
+ final long mRss;
final int id;
final boolean hasActivities;
ArrayList<MemItem> subitems;
- public MemItem(String _label, String _shortLabel, long _pss, long _swapPss, int _id,
- boolean _hasActivities) {
- isProc = true;
- label = _label;
- shortLabel = _shortLabel;
- pss = _pss;
- swapPss = _swapPss;
- id = _id;
- hasActivities = _hasActivities;
+ MemItem(String label, String shortLabel, long pss, long swapPss, long rss, int id,
+ boolean hasActivities) {
+ this.isProc = true;
+ this.label = label;
+ this.shortLabel = shortLabel;
+ this.pss = pss;
+ this.swapPss = swapPss;
+ this.mRss = rss;
+ this.id = id;
+ this.hasActivities = hasActivities;
}
- public MemItem(String _label, String _shortLabel, long _pss, long _swapPss, int _id) {
- isProc = false;
- label = _label;
- shortLabel = _shortLabel;
- pss = _pss;
- swapPss = _swapPss;
- id = _id;
- hasActivities = false;
+ MemItem(String label, String shortLabel, long pss, long swapPss, long rss, int id) {
+ this.isProc = false;
+ this.label = label;
+ this.shortLabel = shortLabel;
+ this.pss = pss;
+ this.swapPss = swapPss;
+ this.mRss = rss;
+ this.id = id;
+ this.hasActivities = false;
}
}
- private static void sortMemItems(List<MemItem> items) {
+ private static void sortMemItems(List<MemItem> items, final boolean pss) {
Collections.sort(items, new Comparator<MemItem>() {
@Override
public int compare(MemItem lhs, MemItem rhs) {
- if (lhs.pss < rhs.pss) {
+ long lss = pss ? lhs.pss : lhs.mRss;
+ long rss = pss ? rhs.pss : rhs.mRss;
+ if (lss < rss) {
return 1;
- } else if (lhs.pss > rhs.pss) {
+ } else if (lss > rss) {
return -1;
}
return 0;
@@ -12150,40 +12155,44 @@ public class ActivityManagerService extends IActivityManager.Stub
}
static final void dumpMemItems(PrintWriter pw, String prefix, String tag,
- ArrayList<MemItem> items, boolean sort, boolean isCompact, boolean dumpSwapPss) {
+ ArrayList<MemItem> items, boolean sort, boolean isCompact, boolean dumpPss,
+ boolean dumpSwapPss) {
if (sort && !isCompact) {
- sortMemItems(items);
+ sortMemItems(items, dumpPss);
}
for (int i=0; i<items.size(); i++) {
MemItem mi = items.get(i);
if (!isCompact) {
- if (dumpSwapPss) {
+ if (dumpPss && dumpSwapPss) {
pw.printf("%s%s: %-60s (%s in swap)\n", prefix, stringifyKBSize(mi.pss),
mi.label, stringifyKBSize(mi.swapPss));
} else {
- pw.printf("%s%s: %s\n", prefix, stringifyKBSize(mi.pss), mi.label);
+ pw.printf("%s%s: %s\n", prefix, stringifyKBSize(dumpPss ? mi.pss : mi.mRss),
+ mi.label);
}
} else if (mi.isProc) {
pw.print("proc,"); pw.print(tag); pw.print(","); pw.print(mi.shortLabel);
- pw.print(","); pw.print(mi.id); pw.print(","); pw.print(mi.pss); pw.print(",");
+ pw.print(","); pw.print(mi.id); pw.print(",");
+ pw.print(dumpPss ? mi.pss : mi.mRss); pw.print(",");
pw.print(dumpSwapPss ? mi.swapPss : "N/A");
pw.println(mi.hasActivities ? ",a" : ",e");
} else {
pw.print(tag); pw.print(","); pw.print(mi.shortLabel); pw.print(",");
- pw.print(mi.pss); pw.print(","); pw.println(dumpSwapPss ? mi.swapPss : "N/A");
+ pw.print(dumpPss ? mi.pss : mi.mRss); pw.print(",");
+ pw.println(dumpSwapPss ? mi.swapPss : "N/A");
}
if (mi.subitems != null) {
dumpMemItems(pw, prefix + " ", mi.shortLabel, mi.subitems,
- true, isCompact, dumpSwapPss);
+ true, isCompact, dumpPss, dumpSwapPss);
}
}
}
static final void dumpMemItems(ProtoOutputStream proto, long fieldId, String tag,
- ArrayList<MemItem> items, boolean sort, boolean dumpSwapPss) {
+ ArrayList<MemItem> items, boolean sort, boolean dumpPss, boolean dumpSwapPss) {
if (sort) {
- sortMemItems(items);
+ sortMemItems(items, dumpPss);
}
for (int i=0; i<items.size(); i++) {
@@ -12195,13 +12204,17 @@ public class ActivityManagerService extends IActivityManager.Stub
proto.write(MemInfoDumpProto.MemItem.IS_PROC, mi.isProc);
proto.write(MemInfoDumpProto.MemItem.ID, mi.id);
proto.write(MemInfoDumpProto.MemItem.HAS_ACTIVITIES, mi.hasActivities);
- proto.write(MemInfoDumpProto.MemItem.PSS_KB, mi.pss);
+ if (dumpPss) {
+ proto.write(MemInfoDumpProto.MemItem.PSS_KB, mi.pss);
+ } else {
+ proto.write(MemInfoDumpProto.MemItem.RSS_KB, mi.mRss);
+ }
if (dumpSwapPss) {
proto.write(MemInfoDumpProto.MemItem.SWAP_PSS_KB, mi.swapPss);
}
if (mi.subitems != null) {
dumpMemItems(proto, MemInfoDumpProto.MemItem.SUB_ITEMS, mi.shortLabel, mi.subitems,
- true, dumpSwapPss);
+ true, dumpPss, dumpSwapPss);
}
proto.end(token);
}
@@ -12500,24 +12513,32 @@ public class ActivityManagerService extends IActivityManager.Stub
final SparseArray<MemItem> procMemsMap = new SparseArray<MemItem>();
long nativePss = 0;
long nativeSwapPss = 0;
+ long nativeRss = 0;
long dalvikPss = 0;
long dalvikSwapPss = 0;
+ long dalvikRss = 0;
long[] dalvikSubitemPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
long[] dalvikSubitemSwapPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
+ long[] dalvikSubitemRss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
+ EmptyArray.LONG;
long otherPss = 0;
long otherSwapPss = 0;
+ long otherRss = 0;
long[] miscPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long[] miscSwapPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
+ long[] miscRss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long oomPss[] = new long[DUMP_MEM_OOM_LABEL.length];
long oomSwapPss[] = new long[DUMP_MEM_OOM_LABEL.length];
+ long[] oomRss = new long[DUMP_MEM_OOM_LABEL.length];
ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[])
new ArrayList[DUMP_MEM_OOM_LABEL.length];
long totalPss = 0;
long totalSwapPss = 0;
+ long totalRss = 0;
long cachedPss = 0;
long cachedSwapPss = 0;
boolean hasSwapPss = false;
@@ -12557,6 +12578,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mi.dalvikPss = (int)Debug.getPss(pid, tmpLong, null);
endTime = SystemClock.currentThreadTimeMillis();
mi.dalvikPrivateDirty = (int)tmpLong[0];
+ mi.dalvikRss = (int) tmpLong[2];
}
if (opts.dumpDetails) {
if (opts.localOnly) {
@@ -12617,22 +12639,27 @@ public class ActivityManagerService extends IActivityManager.Stub
if (!opts.isCheckinRequest && mi != null) {
totalPss += myTotalPss;
totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
MemItem pssItem = new MemItem(r.processName + " (pid " + pid +
(hasActivities ? " / activities)" : ")"), r.processName, myTotalPss,
- myTotalSwapPss, pid, hasActivities);
+ myTotalSwapPss, myTotalRss, pid, hasActivities);
procMems.add(pssItem);
procMemsMap.put(pid, pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
}
otherPss += mi.otherPss;
+ otherRss += mi.otherRss;
otherSwapPss += mi.otherSwappedOutPss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
@@ -12641,6 +12668,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
if (oomAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
@@ -12658,6 +12688,7 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[oomIndex] = new ArrayList<MemItem>();
}
oomProcs[oomIndex].add(pssItem);
+ oomRss[oomIndex] += myTotalRss;
break;
}
}
@@ -12689,25 +12720,33 @@ public class ActivityManagerService extends IActivityManager.Stub
final long myTotalPss = mi.getTotalPss();
final long myTotalSwapPss = mi.getTotalSwappedOutPss();
+ final long myTotalRss = mi.getTotalRss();
totalPss += myTotalPss;
totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
nativeProcTotalPss += myTotalPss;
MemItem pssItem = new MemItem(st.name + " (pid " + st.pid + ")",
- st.name, myTotalPss, mi.getSummaryTotalSwapPss(), st.pid, false);
+ st.name, myTotalPss, mi.getSummaryTotalSwapPss(), myTotalRss,
+ st.pid, false);
procMems.add(pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS
+ + j);
}
otherPss += mi.otherPss;
otherSwapPss += mi.otherSwappedOutPss;
+ otherRss += mi.otherRss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
miscPss[j] += mem;
@@ -12715,6 +12754,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
oomPss[0] += myTotalPss;
oomSwapPss[0] += myTotalSwapPss;
@@ -12722,19 +12764,21 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[0] = new ArrayList<MemItem>();
}
oomProcs[0].add(pssItem);
+ oomRss[0] += myTotalRss;
}
}
}
ArrayList<MemItem> catMems = new ArrayList<MemItem>();
- catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1));
+ catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, nativeRss, -1));
final int dalvikId = -2;
- catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId));
- catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3));
+ catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikRss,
+ dalvikId));
+ catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, otherRss, -3));
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
String label = Debug.MemoryInfo.getOtherLabel(j);
- catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j));
+ catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], miscRss[j], j));
}
if (dalvikSubitemPss.length > 0) {
// Add dalvik subitems.
@@ -12760,7 +12804,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final String name = Debug.MemoryInfo.getOtherLabel(
Debug.MemoryInfo.NUM_OTHER_STATS + j);
memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
- dalvikSubitemSwapPss[j], j));
+ dalvikSubitemSwapPss[j], dalvikSubitemRss[j], j));
}
}
}
@@ -12770,31 +12814,53 @@ public class ActivityManagerService extends IActivityManager.Stub
if (oomPss[j] != 0) {
String label = opts.isCompact ? DUMP_MEM_OOM_COMPACT_LABEL[j]
: DUMP_MEM_OOM_LABEL[j];
- MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j],
+ MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j], oomRss[j],
DUMP_MEM_OOM_ADJ[j]);
item.subitems = oomProcs[j];
oomMems.add(item);
}
}
-
+ if (!opts.isCompact) {
+ pw.println();
+ }
+ if (!brief && !opts.oomOnly && !opts.isCompact) {
+ pw.println();
+ pw.println("Total RSS by process:");
+ dumpMemItems(pw, " ", "proc", procMems, true, opts.isCompact, false, false);
+ pw.println();
+ }
+ if (!opts.isCompact) {
+ pw.println("Total RSS by OOM adjustment:");
+ }
+ dumpMemItems(pw, " ", "oom", oomMems, false, opts.isCompact, false, false);
+ if (!brief && !opts.oomOnly) {
+ PrintWriter out = categoryPw != null ? categoryPw : pw;
+ if (!opts.isCompact) {
+ out.println();
+ out.println("Total RSS by category:");
+ }
+ dumpMemItems(out, " ", "cat", catMems, true, opts.isCompact, false, false);
+ }
opts.dumpSwapPss = opts.dumpSwapPss && hasSwapPss && totalSwapPss != 0;
if (!brief && !opts.oomOnly && !opts.isCompact) {
pw.println();
pw.println("Total PSS by process:");
- dumpMemItems(pw, " ", "proc", procMems, true, opts.isCompact, opts.dumpSwapPss);
+ dumpMemItems(pw, " ", "proc", procMems, true, opts.isCompact, true,
+ opts.dumpSwapPss);
pw.println();
}
if (!opts.isCompact) {
pw.println("Total PSS by OOM adjustment:");
}
- dumpMemItems(pw, " ", "oom", oomMems, false, opts.isCompact, opts.dumpSwapPss);
+ dumpMemItems(pw, " ", "oom", oomMems, false, opts.isCompact, true, opts.dumpSwapPss);
if (!brief && !opts.oomOnly) {
PrintWriter out = categoryPw != null ? categoryPw : pw;
if (!opts.isCompact) {
out.println();
out.println("Total PSS by category:");
}
- dumpMemItems(out, " ", "cat", catMems, true, opts.isCompact, opts.dumpSwapPss);
+ dumpMemItems(out, " ", "cat", catMems, true, opts.isCompact, true,
+ opts.dumpSwapPss);
}
if (!opts.isCompact) {
pw.println();
@@ -13013,24 +13079,32 @@ public class ActivityManagerService extends IActivityManager.Stub
final SparseArray<MemItem> procMemsMap = new SparseArray<MemItem>();
long nativePss = 0;
long nativeSwapPss = 0;
+ long nativeRss = 0;
long dalvikPss = 0;
long dalvikSwapPss = 0;
+ long dalvikRss = 0;
long[] dalvikSubitemPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
long[] dalvikSubitemSwapPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
+ long[] dalvikSubitemRss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
+ EmptyArray.LONG;
long otherPss = 0;
long otherSwapPss = 0;
+ long otherRss = 0;
long[] miscPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long[] miscSwapPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
+ long[] miscRss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long oomPss[] = new long[DUMP_MEM_OOM_LABEL.length];
long oomSwapPss[] = new long[DUMP_MEM_OOM_LABEL.length];
+ long[] oomRss = new long[DUMP_MEM_OOM_LABEL.length];
ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[])
new ArrayList[DUMP_MEM_OOM_LABEL.length];
long totalPss = 0;
long totalSwapPss = 0;
+ long totalRss = 0;
long cachedPss = 0;
long cachedSwapPss = 0;
boolean hasSwapPss = false;
@@ -13069,6 +13143,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mi.dalvikPss = (int) Debug.getPss(pid, tmpLong, null);
endTime = SystemClock.currentThreadTimeMillis();
mi.dalvikPrivateDirty = (int) tmpLong[0];
+ mi.dalvikRss = (int) tmpLong[2];
}
if (opts.dumpDetails) {
if (opts.localOnly) {
@@ -13124,22 +13199,27 @@ public class ActivityManagerService extends IActivityManager.Stub
if (!opts.isCheckinRequest && mi != null) {
totalPss += myTotalPss;
totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
MemItem pssItem = new MemItem(r.processName + " (pid " + pid +
(hasActivities ? " / activities)" : ")"), r.processName, myTotalPss,
- myTotalSwapPss, pid, hasActivities);
+ myTotalSwapPss, myTotalRss, pid, hasActivities);
procMems.add(pssItem);
procMemsMap.put(pid, pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
}
otherPss += mi.otherPss;
+ otherRss += mi.otherRss;
otherSwapPss += mi.otherSwappedOutPss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
@@ -13148,6 +13228,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
if (oomAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
@@ -13165,6 +13248,7 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[oomIndex] = new ArrayList<MemItem>();
}
oomProcs[oomIndex].add(pssItem);
+ oomRss[oomIndex] += myTotalRss;
break;
}
}
@@ -13195,24 +13279,33 @@ public class ActivityManagerService extends IActivityManager.Stub
final long myTotalPss = mi.getTotalPss();
final long myTotalSwapPss = mi.getTotalSwappedOutPss();
+ final long myTotalRss = mi.getTotalRss();
totalPss += myTotalPss;
+ totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
nativeProcTotalPss += myTotalPss;
MemItem pssItem = new MemItem(st.name + " (pid " + st.pid + ")",
- st.name, myTotalPss, mi.getSummaryTotalSwapPss(), st.pid, false);
+ st.name, myTotalPss, mi.getSummaryTotalSwapPss(), myTotalRss,
+ st.pid, false);
procMems.add(pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS
+ + j);
}
otherPss += mi.otherPss;
otherSwapPss += mi.otherSwappedOutPss;
+ otherRss += mi.otherRss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
miscPss[j] += mem;
@@ -13220,6 +13313,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
oomPss[0] += myTotalPss;
oomSwapPss[0] += myTotalSwapPss;
@@ -13227,19 +13323,21 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[0] = new ArrayList<MemItem>();
}
oomProcs[0].add(pssItem);
+ oomRss[0] += myTotalRss;
}
}
}
ArrayList<MemItem> catMems = new ArrayList<MemItem>();
- catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1));
+ catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, nativeRss, -1));
final int dalvikId = -2;
- catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId));
- catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3));
+ catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikRss,
+ dalvikId));
+ catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, otherRss, -3));
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
String label = Debug.MemoryInfo.getOtherLabel(j);
- catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j));
+ catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], miscRss[j], j));
}
if (dalvikSubitemPss.length > 0) {
// Add dalvik subitems.
@@ -13265,7 +13363,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final String name = Debug.MemoryInfo.getOtherLabel(
Debug.MemoryInfo.NUM_OTHER_STATS + j);
memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
- dalvikSubitemSwapPss[j], j));
+ dalvikSubitemSwapPss[j], dalvikSubitemRss[j], j));
}
}
}
@@ -13275,23 +13373,34 @@ public class ActivityManagerService extends IActivityManager.Stub
if (oomPss[j] != 0) {
String label = opts.isCompact ? DUMP_MEM_OOM_COMPACT_LABEL[j]
: DUMP_MEM_OOM_LABEL[j];
- MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j],
+ MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j], oomRss[j],
DUMP_MEM_OOM_ADJ[j]);
item.subitems = oomProcs[j];
oomMems.add(item);
}
}
+ if (!opts.oomOnly) {
+ dumpMemItems(proto, MemInfoDumpProto.TOTAL_RSS_BY_PROCESS, "proc",
+ procMems, true, false, false);
+ }
+ dumpMemItems(proto, MemInfoDumpProto.TOTAL_RSS_BY_OOM_ADJUSTMENT, "oom",
+ oomMems, false, false, false);
+ if (!brief && !opts.oomOnly) {
+ dumpMemItems(proto, MemInfoDumpProto.TOTAL_RSS_BY_CATEGORY, "cat",
+ catMems, true, false, false);
+ }
+
opts.dumpSwapPss = opts.dumpSwapPss && hasSwapPss && totalSwapPss != 0;
if (!opts.oomOnly) {
dumpMemItems(proto, MemInfoDumpProto.TOTAL_PSS_BY_PROCESS, "proc",
- procMems, true, opts.dumpSwapPss);
+ procMems, true, true, opts.dumpSwapPss);
}
dumpMemItems(proto, MemInfoDumpProto.TOTAL_PSS_BY_OOM_ADJUSTMENT, "oom",
- oomMems, false, opts.dumpSwapPss);
+ oomMems, false, true, opts.dumpSwapPss);
if (!brief && !opts.oomOnly) {
dumpMemItems(proto, MemInfoDumpProto.TOTAL_PSS_BY_CATEGORY, "cat",
- catMems, true, opts.dumpSwapPss);
+ catMems, true, true, opts.dumpSwapPss);
}
MemInfoReader memInfo = new MemInfoReader();
memInfo.readMemInfo();