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

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

在这里发帖之前,我已经提到了这篇文章。在那篇文章中,提到,返回堆大小。为了以编程方式检测堆大小,我应该使用此方法吗?如果是这样,我应该在哪里记录它,以便获得应用程序的正确堆大小使用情况?Debug.getNativeHeapSize()


答案 1

这是我使用的:

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)");
    }

答案 2

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


推荐