如何检测Android应用程序的堆大小使用情况

时间:2011-01-27 18:35:09

标签: java android android-emulator android-widget

我想通过两种方式知道我的android应用程序使用的堆空间量: - 以编程方式   - 通过DDMS。

在发布此处之前,我已提到this帖子。在该帖子中,提到Debug.getNativeHeapSize()返回堆大小。这是我应该使用的确切方法,以编程方式检测堆大小?如果是这样,我应该在哪里记录它以获得我的应用程序的正确堆大小使用?

2 个答案:

答案 0 :(得分:55)

这是我使用的:

public static void logHeap() {
        Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/new Double((1048576));
        Double available = new Double(Debug.getNativeHeapSize())/1048576.0;
        Double free = new Double(Debug.getNativeHeapFreeSize())/1048576.0;
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(2);

        Log.d("tag", "debug. =================================");
        Log.d("tag", "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free)");
        Log.d("tag", "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576)) +"MB free)");
    }

答案 1 :(得分:3)

是。 请注意,DDMS中也有堆视图,您可以使用MAT Eclipse,这对内存泄漏跟踪BUT非常有帮助,这是一个巨大的但您看到的数字是由VM管理的仅参考内存。 Android中有很多子系统在VM下实现 - 本机。最简单的示例Bitmap类。您不会在DDMS中看到分配给Bitmap的整个内存,并且垃圾收集器在恢复此内存时不是非常好/快。所以要小心。