diff options
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 135 | ||||
| -rw-r--r-- | core/java/android/os/Debug.java | 62 | ||||
| -rw-r--r-- | core/proto/android/server/activitymanagerservice.proto | 18 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 217 |
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(); |