Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27ff7ba3 authored by Anwar Ghuloum's avatar Anwar Ghuloum Committed by Android (Google) Code Review
Browse files

Merge "More stats for meminfo"

parents 9a78222d 3a8ce1be
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -17067,21 +17067,26 @@ package android.os {
    method public static java.lang.String getOtherLabel(int);
    method public int getOtherPrivateDirty(int);
    method public int getOtherPss(int);
    method public int getOtherSharedClean(int);
    method public int getOtherSharedDirty(int);
    method public int getTotalPrivateDirty();
    method public int getTotalPss();
    method public int getTotalSharedClean();
    method public int getTotalSharedDirty();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public int dalvikPrivateDirty;
    field public int dalvikPss;
    field public int dalvikSharedClean;
    field public int dalvikSharedDirty;
    field public int nativePrivateDirty;
    field public int nativePss;
    field public int nativeSharedClean;
    field public int nativeSharedDirty;
    field public int otherPrivateDirty;
    field public int otherPss;
    field public int otherSharedClean;
    field public int otherSharedDirty;
  }
+22 −12
Original line number Diff line number Diff line
@@ -970,13 +970,20 @@ public final class ActivityThread {
                pw.print(memInfo.otherPss); pw.print(',');
                pw.print(memInfo.nativePss + memInfo.dalvikPss + memInfo.otherPss); pw.print(',');

                // Heap info - shared
                // Heap info - shared dirty
                pw.print(memInfo.nativeSharedDirty); pw.print(',');
                pw.print(memInfo.dalvikSharedDirty); pw.print(',');
                pw.print(memInfo.otherSharedDirty); pw.print(',');
                pw.print(memInfo.nativeSharedDirty + memInfo.dalvikSharedDirty
                        + memInfo.otherSharedDirty); pw.print(',');

                // Heap info - shared clean
                pw.print(memInfo.nativeSharedClean); pw.print(',');
                pw.print(memInfo.dalvikSharedClean); pw.print(',');
                pw.print(memInfo.otherSharedClean); pw.print(',');
                pw.print(memInfo.nativeSharedClean + memInfo.dalvikSharedClean
                        + memInfo.otherSharedClean); pw.print(',');

                // Heap info - private
                pw.print(memInfo.nativePrivateDirty); pw.print(',');
                pw.print(memInfo.dalvikPrivateDirty); pw.print(',');
@@ -984,6 +991,7 @@ public final class ActivityThread {
                pw.print(memInfo.nativePrivateDirty + memInfo.dalvikPrivateDirty
                        + memInfo.otherPrivateDirty); pw.print(',');


                // Object counts
                pw.print(viewInstanceCount); pw.print(',');
                pw.print(viewRootInstanceCount); pw.print(',');
@@ -1018,34 +1026,36 @@ public final class ActivityThread {
            }

            // otherwise, show human-readable format
            printRow(pw, HEAP_COLUMN, "", "", "Shared", "Private", "Heap", "Heap", "Heap");
            printRow(pw, HEAP_COLUMN, "", "Pss", "Dirty", "Dirty", "Size", "Alloc", "Free");
            printRow(pw, HEAP_COLUMN, "", "------", "------", "------", "------", "------",
            printRow(pw, HEAP_COLUMN, "", "", "Shared", "Private", "Shared", "Heap", "Heap", "Heap");
            printRow(pw, HEAP_COLUMN, "", "Pss", "Dirty", "Dirty", "Clean", "Size", "Alloc", "Free");
            printRow(pw, HEAP_COLUMN, "", "------", "------", "------", "------", "------", "------",
                    "------");
            printRow(pw, HEAP_COLUMN, "Native", memInfo.nativePss, memInfo.nativeSharedDirty,
                    memInfo.nativePrivateDirty, nativeMax, nativeAllocated, nativeFree);
                    memInfo.nativePrivateDirty, memInfo.nativeSharedClean, nativeMax, nativeAllocated, nativeFree);
            printRow(pw, HEAP_COLUMN, "Dalvik", memInfo.dalvikPss, memInfo.dalvikSharedDirty,
                    memInfo.dalvikPrivateDirty, dalvikMax, dalvikAllocated, dalvikFree);
                    memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean, dalvikMax, dalvikAllocated, dalvikFree);

            int otherPss = memInfo.otherPss;
            int otherSharedDirty = memInfo.otherSharedDirty;
            int otherPrivateDirty = memInfo.otherPrivateDirty;
            int otherSharedClean = memInfo.otherSharedClean;

            for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
                printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
                        memInfo.getOtherPss(i), memInfo.getOtherSharedDirty(i),
                        memInfo.getOtherPrivateDirty(i), "", "", "");
                        memInfo.getOtherPrivateDirty(i), memInfo.getOtherSharedClean(i), "", "", "");
                otherPss -= memInfo.getOtherPss(i);
                otherSharedDirty -= memInfo.getOtherSharedDirty(i);
                otherPrivateDirty -= memInfo.getOtherPrivateDirty(i);
                otherSharedClean -= memInfo.getOtherSharedClean(i);
            }

            printRow(pw, HEAP_COLUMN, "Unknown", otherPss, otherSharedDirty,
                    otherPrivateDirty, "", "", "");
                    otherPrivateDirty, otherSharedClean, "", "", "");
            printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(),
                    memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
                    nativeMax+dalvikMax, nativeAllocated+dalvikAllocated,
                    nativeFree+dalvikFree);
                    memInfo.getTotalSharedClean(), nativeMax+dalvikMax,
                    nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);

            pw.println(" ");
            pw.println(" Objects");
+34 −8
Original line number Diff line number Diff line
@@ -114,6 +114,8 @@ public final class Debug
        public int dalvikPrivateDirty;
        /** The shared dirty pages used by dalvik. */
        public int dalvikSharedDirty;
        /** The shared clean pages used by dalvik. */
        public int dalvikSharedClean;

        /** The proportional set size for the native heap. */
        public int nativePss;
@@ -121,6 +123,8 @@ public final class Debug
        public int nativePrivateDirty;
        /** The shared dirty pages used by the native heap. */
        public int nativeSharedDirty;
        /** The shared clean pages used by the native heap. */
        public int nativeSharedClean;

        /** The proportional set size for everything else. */
        public int otherPss;
@@ -128,11 +132,16 @@ public final class Debug
        public int otherPrivateDirty;
        /** The shared dirty pages used by everything else. */
        public int otherSharedDirty;
        /** The shared clean pages used by everything else. */
        public int otherSharedClean;

        /** @hide */
        public static final int NUM_OTHER_STATS = 12;

        private int[] otherStats = new int[NUM_OTHER_STATS*3];
        /** @hide */
        public static final int NUM_CATEGORIES = 4;

        private int[] otherStats = new int[NUM_OTHER_STATS*NUM_CATEGORIES];

        public MemoryInfo() {
        }
@@ -158,21 +167,32 @@ public final class Debug
            return dalvikSharedDirty + nativeSharedDirty + otherSharedDirty;
        }

        /**
         * Return total shared clean memory usage in kB.
         */
        public int getTotalSharedClean() {
            return dalvikSharedClean + nativeSharedClean + otherSharedClean;
        }

        /* @hide */
        public int getOtherPss(int which) {
            return otherStats[which*3];
            return otherStats[which*NUM_CATEGORIES];
        }

        /* @hide */
        public int getOtherPrivateDirty(int which) {
            return otherStats[which*3 + 1];
            return otherStats[which*NUM_CATEGORIES + 1];
        }

        /* @hide */
        public int getOtherSharedDirty(int which) {
            return otherStats[which*3 + 2];
            return otherStats[which*NUM_CATEGORIES + 2];
        }

        /* @hide */
        public int getOtherSharedClean(int which) {
            return otherStats[which*NUM_CATEGORIES + 3];
        }
        
        /* @hide */
        public static String getOtherLabel(int which) {
@@ -186,8 +206,8 @@ public final class Debug
                case 6: return ".apk mmap";
                case 7: return ".ttf mmap";
                case 8: return ".dex mmap";
                case 9: return ".oat mmap";
                case 10: return ".art mmap";
                case 9: return "code mmap";
                case 10: return "image mmap";
                case 11: return "Other mmap";
                default: return "????";
            }
@@ -201,12 +221,15 @@ public final class Debug
            dest.writeInt(dalvikPss);
            dest.writeInt(dalvikPrivateDirty);
            dest.writeInt(dalvikSharedDirty);
            dest.writeInt(dalvikSharedClean);
            dest.writeInt(nativePss);
            dest.writeInt(nativePrivateDirty);
            dest.writeInt(nativeSharedDirty);
            dest.writeInt(nativeSharedClean);
            dest.writeInt(otherPss);
            dest.writeInt(otherPrivateDirty);
            dest.writeInt(otherSharedDirty);
            dest.writeInt(otherSharedClean);
            dest.writeIntArray(otherStats);
        }

@@ -214,12 +237,15 @@ public final class Debug
            dalvikPss = source.readInt();
            dalvikPrivateDirty = source.readInt();
            dalvikSharedDirty = source.readInt();
            dalvikSharedClean = source.readInt();
            nativePss = source.readInt();
            nativePrivateDirty = source.readInt();
            nativeSharedDirty = source.readInt();
            nativeSharedClean = source.readInt();
            otherPss = source.readInt();
            otherPrivateDirty = source.readInt();
            otherSharedDirty = source.readInt();
            otherSharedClean = source.readInt();
            otherStats = source.createIntArray();
        }

+12 −3
Original line number Diff line number Diff line
@@ -64,20 +64,22 @@ struct stat_fields {
    jfieldID pss_field;
    jfieldID privateDirty_field;
    jfieldID sharedDirty_field;
    jfieldID sharedClean_field;
};

struct stat_field_names {
    const char* pss_name;
    const char* privateDirty_name;
    const char* sharedDirty_name;
    const char* sharedClean_name;
};

static stat_fields stat_fields[_NUM_CORE_HEAP];

static stat_field_names stat_field_names[_NUM_CORE_HEAP] = {
    { "otherPss", "otherPrivateDirty", "otherSharedDirty" },
    { "dalvikPss", "dalvikPrivateDirty", "dalvikSharedDirty" },
    { "nativePss", "nativePrivateDirty", "nativeSharedDirty" }
    { "otherPss", "otherPrivateDirty", "otherSharedDirty", "otherSharedClean" },
    { "dalvikPss", "dalvikPrivateDirty", "dalvikSharedDirty", "dalvikSharedClean" },
    { "nativePss", "nativePrivateDirty", "nativeSharedDirty", "nativeSharedClean" }
};

jfieldID otherStats_field;
@@ -86,6 +88,7 @@ struct stats_t {
    int pss;
    int privateDirty;
    int sharedDirty;
    int sharedClean;
};

#define BINDER_STATS "/proc/binder/stats"
@@ -234,6 +237,7 @@ static void read_mapinfo(FILE *fp, stats_t* stats)
            stats[whichHeap].pss += pss;
            stats[whichHeap].privateDirty += private_dirty;
            stats[whichHeap].sharedDirty += shared_dirty;
            stats[whichHeap].sharedClean += shared_clean;
        }
    }
}
@@ -263,12 +267,14 @@ static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz,
        stats[HEAP_UNKNOWN].pss += stats[i].pss;
        stats[HEAP_UNKNOWN].privateDirty += stats[i].privateDirty;
        stats[HEAP_UNKNOWN].sharedDirty += stats[i].sharedDirty;
        stats[HEAP_UNKNOWN].sharedClean += stats[i].sharedClean;
    }

    for (int i=0; i<_NUM_CORE_HEAP; i++) {
        env->SetIntField(object, stat_fields[i].pss_field, stats[i].pss);
        env->SetIntField(object, stat_fields[i].privateDirty_field, stats[i].privateDirty);
        env->SetIntField(object, stat_fields[i].sharedDirty_field, stats[i].sharedDirty);
        env->SetIntField(object, stat_fields[i].sharedClean_field, stats[i].sharedClean);
    }

    jintArray otherIntArray = (jintArray)env->GetObjectField(object, otherStats_field);
@@ -283,6 +289,7 @@ static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz,
        otherArray[j++] = stats[i].pss;
        otherArray[j++] = stats[i].privateDirty;
        otherArray[j++] = stats[i].sharedDirty;
        otherArray[j++] = stats[i].sharedClean;
    }

    env->ReleasePrimitiveArrayCritical(otherIntArray, otherArray, 0);
@@ -640,6 +647,8 @@ int register_android_os_Debug(JNIEnv *env)
                env->GetFieldID(clazz, stat_field_names[i].privateDirty_name, "I");
        stat_fields[i].sharedDirty_field =
                env->GetFieldID(clazz, stat_field_names[i].sharedDirty_name, "I");
        stat_fields[i].sharedClean_field =
                env->GetFieldID(clazz, stat_field_names[i].sharedClean_name, "I");
    }

    return jniRegisterNativeMethods(env, "android/os/Debug", gMethods, NELEM(gMethods));