我已经通过在我的应用程序代码中插入语句Debug.dumpHprofData("/sdcard/myapp.hprof");
来创建了一个hprof文件;然后我通过hprof-conv运行hprof文件并在Eclipse中打开转换后的文件。
根据MAT“Cheat Sheet”的建议,我已经通过“泄漏识别 - >组件报告”输入“com.prepbgg。*”并点击“完成”来获得对我的应用程序内存使用情况的分析。
我知道我的应用程序正在消耗大量内存:特别是在我调用dumpHprofData的阶段,它有一个百万像素的位图对象和一个必须消耗几百KB的画布。 (我还怀疑它正在泄漏大量内存,因为在屏幕旋转几次后性能会严重下降。)
但是,com.prepbgg。*的组件报告显示总内存仅为38.7KB。直方图视图显示android.graphics.Bitmap(可能这是包括我在内的所有应用程序的总数)404对象和Shallow Heap 12,928。这是12,928字节吗?
显然,我的应用程序消耗超过38.7KB,而Bitmap远远超过12,928字节。我哪里错了?如何查看应用程序消耗的总内存?
答案 0 :(得分:1)
位图的大部分空间都在本机堆上。看到Bitmap的源代码:它有七个字段。假设每个字段是四个字节(几乎确定为引用和整数,并且对于布尔值是合理的)为对象头添加额外的四个字节,并且:
(7*4 + 4) * 404 = 12928
我认为没有任何简单的方法可以在不运行自己的构建的情况下检查本机堆。
您可以询问已分配了多少内容:http://developer.android.com/reference/android/os/Debug.html#getNativeHeapAllocatedSize()