android内存泄露和释放,Android应用内存泄露分析

这个命令会列出应用目前的内存分配情况,单位是KB

当分析这些信息时,你应该熟悉下面几种类型的分配:

Private (Clean and Dirty) RAM

这些内存是只被你的进程使用的。这是当你的应用被销毁后系统可以回收的内存量。通常,最重要的列是“private dirty”,它的消耗是非常昂贵的,因为只能被你的进程使用,并且它的内容只能存在于内存并且不能被交换到外部存储中(因为Android没有使用swap)。所有本进程的Dalvik和native堆的分配都是privatedirty的内存,与Zygote进程共享的Dalvik和native分配是shared dirty的内存。

Proportional Set Size (PSS)

这是应用的内存使用大小,包含了进程间共享的页。任何只属于你进程的内存页直接全部算在PSS值中,与其它进程共享的内存页,按照成比例的量算进PSS值中,比如,两个进程共享一个页,那么每一个进程的PSS都只增加该页大小的一半。

PSS测量一个好的特性是可以将所有进程的PSS加起来确定所有进程的内存使用量,这意味这PSS是衡量进程内存占用,进程间内存使用对比和所有有效内存的好方法。

例如,下面是Gmail进程在平板设备上的内存使用情况,里面有很多信息,但关键点是下面列的几个:

** MEMINFO in pid 9953 [com.google.android.gm] **

Pss Pss Shared Private Shared Private Heap Heap Heap

Total Clean Dirty Dirty Clean Clean Size Alloc Free

------ ------ ------ ------ ------ ------ ------ ------ ------

Native Heap 0 0 0 0 0 0 7800 7637(6) 126

Dalvik Heap 5110(3) 0 4136 4988(3) 0 0 9168 8958(6) 210

Dalvik Other 2850 0 2684 2772 0 0

Stack 36 0 8 36 0 0

Cursor 136 0 0 136 0 0

Ashmem 12 0 28 0 0 0

Other dev 380 0 24 376 0 4

.so mmap 5443(5) 1996 2584 2664(5) 5788 1996(5)

.apk mmap 235 32 0 0 1252 32

.ttf mmap 36 12 0 0 88 12

.dex mmap 3019(5) 2148 0 0 8936 2148(5)

Other mmap 107 0 8 8 324 68

Unknown 6994(4) 0 252 6992(4) 0 0

TOTAL 24358(1) 4188 9724 17972(2)16388 4260(2)16968 16595 336

Objects

Views: 426 ViewRootImpl: 3(8)

AppContexts: 6(7) Activities: 2(7)

Assets: 2 AssetManagers: 2

Local Binders: 64 Proxy Binders: 34

Death Recipients: 0

OpenSSL Sockets: 1

SQL

MEMORY_USED: 1739

PAGECACHE_OVERFLOW: 1164 MALLOC_SIZE: 62

通常,你应该关心的只用PssTotal和Private Dirty两列。在某些情况下,PrivateClean和Heap Alloc列也提供了有趣的数据。下面是不同内存分配种类的信息:

Dalvik Heap

应用中Dalvik使用的内存。PssTotal包含所有Zygote进程中的分配(在多个进程中共享根据权重来算),PrivateDirty是你的应用单独使用的堆内存,由应用自己的内存分配和从Zygote进程复制后来后又进行修改过的内存页。

在比较新的版本里有DalvikOther项,Pss Total和Private Dirty显示的Dalvik Heap数据,并不包含Dalvik的开销,比如JIT和GC的开销,在旧版本上面都把它们归并到了Dalvik里。

Heap Alloc

Heap Alloc是Dalvik和native堆分配器跟踪应用app消耗的内存,这个值比Pss Total和Private Dirty大,因为你的进程是从Zygote进程复制的,它包含了与其他进程共享分配的内存。

.so mmap 和.dex mmap

被用来映射.so和.dex代码的内存,Pss Total包含了应用之间共享的平台性代码,Private Clean是应用自身代码消耗的内存,通常,实际的映射内存会更加大,这里显示的内存只是需要被app执行的代码所占用的大小,但是,.so映射会占用很大的private dirty内存,因为当代码被加载到最后的地址时需要转换为本地代码。

Unknown

任何系统不能分类到其他种类的内存页,目前,它包含了大部分native分配,因为ASLR技术的存在,不能被工具识别。就像Dalvik一样,Pss Total包含了与Zygote共享的部分,Private Dirty是只属于你的app的未知内存。

Total

你的进程使用的Pss内存总共的大小,这是所有PSS列数据之和,它表明了你的进程所占用内存的大小,可以与其他进程和有效内存进行对比。

Private Dirty和Private Clean是你进程的总共分配内存,它是不与其它进程共享的。它们加起来(特别是Private Dirty)是当进程被销毁后系统可以回收的内存。Dirty内存是那些被修改的必须保留提交到内存的页,clean内存是那些映射持久化文件到内存所占用的页(比如被执行的代码),如果一段时间不被使用可以被交换出去。

ViewRootImpl

你的进程中活跃的rootview的数量,每一个root view都和一个window关联,所有这可以帮助你区分涉及到dialog或者其他widows的内存泄露

AppContext和Activities

你的进程中存在的Context和Activity对象的数量,这对快速识别由于静态引用导致Activity对象的泄露是很有帮助的,这些对象引用了其他许多的对象,所以如果泄露会导致其他大量的内存不能被释放。一个View或者Drawable会保持一个对Activity的引用,所有保持一个View或者Drawable不被释放也会导致你的app泄露一个Activity。

通过MAT工具进行分析,后面会有文章专门介绍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值