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

Posted

技术标签:

【中文标题】如何检测 android 应用程序的堆大小使用情况【英文标题】:How do I detect the heap size usage of an android application 【发布时间】:2011-06-16 18:16:48 【问题描述】:

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

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

【问题讨论】:

在这篇文章中***.com/questions/2298208/…Dianne 提供了大量可能有帮助的信息。 【参考方案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-native下实现。最简单的示例 Bitmap 类。您不会在 DDMS 中看到分配给位图的整个内存,并且垃圾收集器在恢复此内存方面不是很好/很快。所以要小心。

【讨论】:

以上是关于如何检测 android 应用程序的堆大小使用情况的主要内容,如果未能解决你的问题,请参考以下文章

不同Android设备的堆大小[重复]

Android:如何在运行时增加堆大小?

Android:每个意图/活动的堆大小是多少?

Android中JVM的堆大小[重复]

Java非常大的堆大小[关闭]

如何增加.NET 的堆大小? [复制]