因为Android是为移动设备设计的操作系统,所以你应该经常关心你app使用的RAM。虽然Android的Dalvik虚拟机执行了例常的垃圾回收,但是这并不意味着你可以忽视内存的分配和释放,为了提供稳定的用户体验和系统在各个app之间快速的切换,减少当用户不与程序进行交互时的不必要的内存消耗非常重要。
解释日志信息
开始监视你app内存应用的最简单的方式是Dalvik日志信息。你可以在Logcat看到日志。
每次垃圾回收发生时,Logcat打印具有以下信息的日志:
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>
<GC_Reason>
什么触发了何种垃圾回收,包含以下信息:
GC_CONCURRENT 一个并行的垃圾回收,当你的对将要满是释放内存
GC_FOR_MALLOC 在你对内存满的时候你的app试图分配内存,所以系统不得不停止 你的app回收内存
GC_HPROF_DUMP_HEAP 当你创建HPROF文件来分析你的堆时
GC_EXPLICIT 呼叫GC时(你应该避免在代码中呼叫GC,充分相信垃圾回收机制)
GC_EXTERNAL_ALLOC 只在API10一下才会发生
<Amount_freed>
此次垃圾回收了多少内存
<heap_stats>
释放百分比和对象数量/对内存大小
<External_memory_stats>
API10以下用到
<Pause_time>
所需时间,开始回收时+即将结束时
例如:
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
这些日志信息整合到一块,查看堆内存状态(上面例子中是3571/9991k),如果这个数值一直增长没有变小的迹象,那就有可能出现内存泄露
查看堆更新
追踪分配
当你开始缩小内存问题时,你应该使用AllocationTracker来更好的理解其中的占用内存的对象是如何分配的。AllocationTracker不光对查看具体的内存使用有用,而且可以分析应用程序,例如滚动的关键代码路径。
如何用AlloationTracker:
1,打开DeviceMonitor
2,在DDMS窗口,在左边的列表中选择你app的进程
3,右边选择AllocationTracker面板
4,点击StartTracking
5,与你的app互动来执行逆向分析的代码路径。
6,点击GetAllocation,更新内存分配列表
列表显示了所有最近的分配,目前由512项环形缓冲区限制。点击其中一行 ,即可查看导致内存分配的堆栈跟踪。这些跟踪信息不光显示了哪种类型对象的内存分配,并且在那个线程,哪个类,哪个文件哪一行都有详细的跟踪。
虽然不是万能的,但是AllocationTracker能够协助你定位一些你代码中的问题,例如,一些app会在每次draw的时候new一个paint对象,把这个对象设置成全局的成员变量回事一中很好的解决方法。
查看总体内存分配
占位
捕捉堆转储
占位
触发内存泄露
占位