Applications Memory Usage (kB):
Uptime: 14237237 Realtime: 23790474
** MEMINFO in pid 8071 [com.xtc.watch] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
Native Heap 0 0 0 0 21924 8558 6405
Dalvik Heap 122472 122372 0 15672 143308 65400 77908
Dalvik Other 10361 10076 164 224
Stack 440 440 0 8
Other dev 4 0 4 0
.so mmap 6441 3452 2636 2048
.apk mmap 611 0 340 0
.ttf mmap 538 0 504 0
.dex mmap 8407 1640 2940 40
Other mmap 80 4 0 0
Unknown 10940 10936 0 148
TOTAL 160294 148920 6588 18140 165232 73958 84313
Objects
Views: 288 ViewRootImpl: 2
AppContexts: 11 Activities: 2
Assets: 5 AssetManagers: 5
Local Binders: 30 Proxy Binders: 38
Death Recipients: 3
OpenSSL Sockets: 1
SQL
MEMORY_USED: 138
PAGECACHE_OVERFLOW: 24 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 20 306 25/47/12 /data/data/com.xtc.watch/databases/upload.db
-
Native Heap是native层的内存堆栈,Dalvik Heap是java层的内存堆栈,如果这二者加起来的内存占用超过了应用最大内存限制就会报OOM异常,剩下的.so mmap是 C 库代码占用的内存,.jar mmap是Java 文件代码占用的内存 ,.apk mmap是apk代码占用的内存,.dex mmap是Dex 文件代码占用的内存
-
Objects中的Activities表示当前内存中的activity对象的个数,启动一个activity就会生成一个activity对象,当退出activity的时候,activity对象就会被释放,所以反复的进出一个activity界面然后查看Activities的个数有没有保持不变,如果增加了,那么就说明这个activity对象没有被释放,也就是说可能存在内存泄漏,但是具体哪里泄漏了并不知道
[](()DDMS查看内存使用情况
eclipse中有一个ddms工具,可以查看线程信息(Threads),内存使用情况(VM Heap),内存分配跟踪(Allocation Tracker),CUP使用情况(Sysinfo CUP load),内存使用饼状图(Sysinfo Memory usage),这里我们暂时用到VM Heap,选择要查看的app进程,点击左上角的show heap updates,选择VM Heap并点击Cause GC按钮,然后就出现下图:
观察data object的Total Size选项,这个是app的创建的java对象做占用的内存大小,Count是总内存的对象的个数,反复的进出一个activity,看data object的Total Size有没有明显的增加,正常情况下进入一个activity的时候会明显增加,退出一个activity会有明显的回落,总体是维持在一个比较稳定的水平如果反复进出activity,Total Size不断上升,那么可能就存在内存泄漏了,需要具体排查
[](()MAT分析内存泄漏,用AndroidStudio的Monitors的Memory
-
多点击几下Initiate GC来回收一下可被释放的java对象,因为java的GC是定期有条件执行的,当内存中只存在很少的无用对象,这时候可能并不会触发GC,所以手动触发GC来保证开始检测内存的时候内存都是最干净的
-
点击Dump Java Heap,然后过一会儿就会出现一份数据分析文件,这时候的这份数据文件是刚开始的程序对象内存占用情况,接下去就针对一个activity反复操作进出等等各种反复操作,觉得差不多了,这时候就再次疯狂点击Initiate GC回收一下可是放的对象,点击Dump Java He 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 ap,这时候生成的数据分析文件就是经过你疯狂操作后的内存占用情况了
生成的上述两个文件右键,点击Export to Standar .hprof导出到一个自己指定的目录文件夹
- 去官网上面下载MAT来打开这两个文件开始内存分析
上图中Problem Suspect部分是代表可能存在内存泄漏的地方,Remainder表示正常的部分,再继续往下看