From cb86245b99b677caaaa5d55e141936ac61e900c2 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Thu, 13 Jul 2017 15:01:34 -0700 Subject: [PATCH] Add more details to dumpsys meminfo -d Added new subitems for .dex: boot vdex app vdex app odex .art app art boot art Fixed accounting for dalvik other to be subitems of other subsection instead of dalvik. Sample output: 261,892K: Native 213,196K: .dex mmap 111,620K: .App vdex 65,070K: .App dex 36,506K: .Boot vdex 192,320K: EGL mtrack 161,835K: .so mmap 134,922K: .apk mmap 85,612K: Dalvik 74,656K: .Heap 4,526K: .Zygote 4,218K: .LOS 2,212K: .NonMoving 64,906K: Unknown 52,119K: .oat mmap 42,828K: Dalvik Other 32,704K: .LinearAlloc 3,672K: .JITCache 3,248K: .IndirectRef 3,204K: .GC 40,754K: .art mmap 31,133K: .Boot art 9,621K: .App art 21,976K: Other mmap 20,704K: Stack 16,270K: Gfx dev 9,200K: GL mtrack 3,428K: Other dev 2,744K: .ttf mmap 1,116K: Ashmem 1,052K: .jar mmap 0K: Cursor 0K: Other mtrack Test: dumpsys meminfo -d Test: dumpsys meminfo -s Test: dumpsys meminfo Test: dumpsys meminfo Test: dumpsys memifno -d Bug: 32331673 (cherry picked from commit 95550dd39440196d364767fc18d441ed5a0e36d6) Change-Id: I7557ee09510651c7b5ddee646c92adbcdd3472db --- core/java/android/os/Debug.java | 75 +++++++++++++++---- core/jni/android_os_Debug.cpp | 56 ++++++++++---- .../server/am/ActivityManagerService.java | 42 ++++++++--- 3 files changed, 134 insertions(+), 39 deletions(-) diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index e05bd89079afb..55b6dc817e5cb 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -221,28 +221,69 @@ public final class Debug /** @hide */ public static final int OTHER_OTHER_MEMTRACK = 16; + // Needs to be declared here for the DVK_STAT ranges below. + /** @hide */ + public static final int NUM_OTHER_STATS = 17; + + // Dalvik subsections. /** @hide */ public static final int OTHER_DALVIK_NORMAL = 17; /** @hide */ public static final int OTHER_DALVIK_LARGE = 18; /** @hide */ - public static final int OTHER_DALVIK_LINEARALLOC = 19; + public static final int OTHER_DALVIK_ZYGOTE = 19; /** @hide */ - public static final int OTHER_DALVIK_ACCOUNTING = 20; + public static final int OTHER_DALVIK_NON_MOVING = 20; + // Section begins and ends for dumpsys, relative to the DALVIK categories. /** @hide */ - public static final int OTHER_DALVIK_CODE_CACHE = 21; + public static final int OTHER_DVK_STAT_DALVIK_START = + OTHER_DALVIK_NORMAL - NUM_OTHER_STATS; /** @hide */ - public static final int OTHER_DALVIK_ZYGOTE = 22; + public static final int OTHER_DVK_STAT_DALVIK_END = + OTHER_DALVIK_NON_MOVING - NUM_OTHER_STATS; + + // Dalvik Other subsections. /** @hide */ - public static final int OTHER_DALVIK_NON_MOVING = 23; + public static final int OTHER_DALVIK_OTHER_LINEARALLOC = 21; /** @hide */ - public static final int OTHER_DALVIK_INDIRECT_REFERENCE_TABLE = 24; + public static final int OTHER_DALVIK_OTHER_ACCOUNTING = 22; + /** @hide */ + public static final int OTHER_DALVIK_OTHER_CODE_CACHE = 23; + /** @hide */ + public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 24; + /** @hide */ + public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 25; + /** @hide */ + public static final int OTHER_DVK_STAT_DALVIK_OTHER_START = + OTHER_DALVIK_OTHER_LINEARALLOC - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_DALVIK_OTHER_END = + OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE - NUM_OTHER_STATS; + + // Dex subsections (Boot vdex, App dex, and App vdex). + /** @hide */ + public static final int OTHER_DEX_BOOT_VDEX = 26; + /** @hide */ + public static final int OTHER_DEX_APP_DEX = 27; + /** @hide */ + public static final int OTHER_DEX_APP_VDEX = 28; + /** @hide */ + public static final int OTHER_DVK_STAT_DEX_START = OTHER_DEX_BOOT_VDEX - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_DEX_END = OTHER_DEX_APP_VDEX - NUM_OTHER_STATS; + + // Art subsections (App image, boot image). + /** @hide */ + public static final int OTHER_ART_APP = 29; + /** @hide */ + public static final int OTHER_ART_BOOT = 30; + /** @hide */ + public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_ART_END = OTHER_ART_BOOT - NUM_OTHER_STATS; /** @hide */ - public static final int NUM_OTHER_STATS = 17; - - /** @hide */ - public static final int NUM_DVK_STATS = 8; + public static final int NUM_DVK_STATS = 14; /** @hide */ public static final int NUM_CATEGORIES = 8; @@ -406,12 +447,18 @@ public final class Debug case OTHER_OTHER_MEMTRACK: return "Other mtrack"; case OTHER_DALVIK_NORMAL: return ".Heap"; case OTHER_DALVIK_LARGE: return ".LOS"; - case OTHER_DALVIK_LINEARALLOC: return ".LinearAlloc"; - case OTHER_DALVIK_ACCOUNTING: return ".GC"; - case OTHER_DALVIK_CODE_CACHE: return ".JITCache"; case OTHER_DALVIK_ZYGOTE: return ".Zygote"; case OTHER_DALVIK_NON_MOVING: return ".NonMoving"; - case OTHER_DALVIK_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; + case OTHER_DALVIK_OTHER_LINEARALLOC: return ".LinearAlloc"; + case OTHER_DALVIK_OTHER_ACCOUNTING: return ".GC"; + case OTHER_DALVIK_OTHER_CODE_CACHE: return ".JITCache"; + case OTHER_DALVIK_OTHER_COMPILER_METADATA: return ".CompilerMetadata"; + case OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; + case OTHER_DEX_BOOT_VDEX: return ".Boot vdex"; + case OTHER_DEX_APP_DEX: return ".App dex"; + case OTHER_DEX_APP_VDEX: return ".App vdex"; + case OTHER_ART_APP: return ".App art"; + case OTHER_ART_BOOT: return ".Boot art"; default: return "????"; } } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 821d0e515d092..120962390ef35 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -75,14 +75,27 @@ enum { HEAP_GL, HEAP_OTHER_MEMTRACK, + // Dalvik extra sections (heap). HEAP_DALVIK_NORMAL, HEAP_DALVIK_LARGE, - HEAP_DALVIK_LINEARALLOC, - HEAP_DALVIK_ACCOUNTING, - HEAP_DALVIK_CODE_CACHE, HEAP_DALVIK_ZYGOTE, HEAP_DALVIK_NON_MOVING, - HEAP_DALVIK_INDIRECT_REFERENCE_TABLE, + + // Dalvik other extra sections. + HEAP_DALVIK_OTHER_LINEARALLOC, + HEAP_DALVIK_OTHER_ACCOUNTING, + HEAP_DALVIK_OTHER_CODE_CACHE, + HEAP_DALVIK_OTHER_COMPILER_METADATA, + HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE, + + // Boot vdex / app dex / app vdex + HEAP_DEX_BOOT_VDEX, + HEAP_DEX_APP_DEX, + HEAP_DEX_APP_VDEX, + + // App art, boot art. + HEAP_ART_APP, + HEAP_ART_BOOT, _NUM_HEAP, _NUM_EXCLUSIVE_HEAP = HEAP_OTHER_MEMTRACK+1, @@ -297,15 +310,30 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) whichHeap = HEAP_TTF; is_swappable = true; } else if ((nameLen > 4 && strstr(name, ".dex") != NULL) || - (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0) || - (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0)) { + (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0)) { whichHeap = HEAP_DEX; + subHeap = HEAP_DEX_APP_DEX; + is_swappable = true; + } else if (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0) { + whichHeap = HEAP_DEX; + // Handle system@framework@boot* and system/framework/boot* + if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) { + subHeap = HEAP_DEX_BOOT_VDEX; + } else { + subHeap = HEAP_DEX_APP_VDEX; + } is_swappable = true; } else if (nameLen > 4 && strcmp(name+nameLen-4, ".oat") == 0) { whichHeap = HEAP_OAT; is_swappable = true; } else if (nameLen > 4 && strcmp(name+nameLen-4, ".art") == 0) { whichHeap = HEAP_ART; + // Handle system@framework@boot* and system/framework/boot* + if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) { + subHeap = HEAP_ART_BOOT; + } else { + subHeap = HEAP_ART_APP; + } is_swappable = true; } else if (strncmp(name, "/dev/", 5) == 0) { if (strncmp(name, "/dev/kgsl-3d0", 13) == 0) { @@ -314,7 +342,7 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) if (strncmp(name, "/dev/ashmem/dalvik-", 19) == 0) { whichHeap = HEAP_DALVIK_OTHER; if (strstr(name, "/dev/ashmem/dalvik-LinearAlloc") == name) { - subHeap = HEAP_DALVIK_LINEARALLOC; + subHeap = HEAP_DALVIK_OTHER_LINEARALLOC; } else if ((strstr(name, "/dev/ashmem/dalvik-alloc space") == name) || (strstr(name, "/dev/ashmem/dalvik-main space") == name)) { // This is the regular Dalvik heap. @@ -332,13 +360,14 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) whichHeap = HEAP_DALVIK; subHeap = HEAP_DALVIK_ZYGOTE; } else if (strstr(name, "/dev/ashmem/dalvik-indirect ref") == name) { - subHeap = HEAP_DALVIK_INDIRECT_REFERENCE_TABLE; + subHeap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE; } else if (strstr(name, "/dev/ashmem/dalvik-jit-code-cache") == name || - strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name || - strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) { - subHeap = HEAP_DALVIK_CODE_CACHE; + strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name) { + subHeap = HEAP_DALVIK_OTHER_CODE_CACHE; + } else if (strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) { + subHeap = HEAP_DALVIK_OTHER_COMPILER_METADATA; } else { - subHeap = HEAP_DALVIK_ACCOUNTING; // Default to accounting. + subHeap = HEAP_DALVIK_OTHER_ACCOUNTING; // Default to accounting. } } else if (strncmp(name, "/dev/ashmem/CursorWindow", 24) == 0) { whichHeap = HEAP_CURSOR; @@ -423,7 +452,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) stats[whichHeap].sharedClean += shared_clean; stats[whichHeap].swappedOut += swapped_out; stats[whichHeap].swappedOutPss += swapped_out_pss; - if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER) { + if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER || + whichHeap == HEAP_DEX || whichHeap == HEAP_ART) { stats[subHeap].pss += pss; stats[subHeap].swappablePss += swappable_pss; stats[subHeap].privateDirty += private_dirty; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c5fc038028e26..784a7104bba4f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16447,23 +16447,41 @@ public final class ActivityManagerService extends ActivityManagerNative ArrayList catMems = new ArrayList(); catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1)); - final MemItem dalvikItem = - new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, -2); - if (dalvikSubitemPss.length > 0) { - dalvikItem.subitems = new ArrayList(); - for (int j=0; j 0) { + // Add dalvik subitems. + for (MemItem memItem : catMems) { + int memItemStart = 0, memItemEnd = 0; + if (memItem.id == dalvikId) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_DALVIK_OTHER) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_DEX) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_ART) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_ART_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_ART_END; + } else { + continue; // No subitems, continue. + } + memItem.subitems = new ArrayList(); + for (int j=memItemStart; j<=memItemEnd; j++) { + final String name = Debug.MemoryInfo.getOtherLabel( + Debug.MemoryInfo.NUM_OTHER_STATS + j); + memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j], + dalvikSubitemSwapPss[j], j)); + } + } + } ArrayList oomMems = new ArrayList(); for (int j=0; j