android内存管理机制与优化

android内存管理机制与优化心得

简介

android使用Dvalik/ART虚拟机来对应用管理,其使用专门的垃圾回收机制来管理堆上的内存,程序员无需自己去释放分配的内存;虽然减轻了我们许多的工作量,但是当我们开发的时候分配内存不合理,也很容易造成内存管理不当,如内存抖动、内存泄漏和内存碎片,所以我们也要弄明白虚拟机是如何管理内存,然后我们在去针对性的优化

内存管理机制

android内存采用的是paging页和mapping映射来对内存进行管理,page主要是把内存化成一页页的管理,而mapping主要是映射一些库和共享变量到我们的app进程;
然后,虚拟机使用分代垃圾回收的方法,年轻代和年老代,年轻代采用复制算法垃圾回收,这是为了解决内存碎片的问题,但是也不能完全解决内存碎片的问题,因为内存管理的最小单位就是以页来管理的,如果一页4K,哪怕只占用了1K,也无法对这页内存进行回收;内存出现问题后,一般会引出以下几个问题:

内存抖动

所谓内存抖动,直观的感受就是内存动态波形图,连续上下的波峰波谷,其背后就是因为频繁的创建对象分配堆上的内存,使堆上内存达到了一定的阈值,触发垃圾回收去回收内存,释放后又大量分配内存,垃圾回收在释放,不停的重复这一过程;

内存泄漏

android的内存泄漏一个原则就是生命周期长的对象持有生命周期短的对象,导致短周期对象无法及时得到回收,这个解决的办法:一是不使用的引用后,我们要及时将引用赋值为null,对于一些特殊场景,如跨线程的操作,可以使用弱引用持有对象,弱引用不影响GC对垃圾的回收;

内存碎片

页单位来管理内存,假如每页4K,使用for循环不停2K+1K的对象,分配第一页时,先占用2K,然后再占用1K,第二次循环分配,需要2K内存,但是发现第一页已经只剩下1K了,这个时候只能到下一个内存页,分配2K和1K,这样循环下来,每页都还剩下1K的空闲内存,加入每页中的2K是临时变量,而1K则是长久的对象,一次GC下来,2K释放了还有许多的页内存占用1K,这个内存页无法得到释放,也无法被分配,这就产生了许多咨询无法使用;

如何解决?

使用复用池,有对象池和Bitmap复用池,实质原理提请申请好一些对象,占用内存,申请时我们去对象池索取,不使用时规还给对象池,这样我们多次使用的内存都是同一块内存,就不会造成内存碎片和内存抖动了

对象池
Pools.SynchronizedPool<Object> t = new Pools.SynchronizedPool<>(10);
Object obj = t.acquire();
t.release(obj);

android中的message就是用的这个东西

最后,我们app其实占用内存大的更多的都是图片,图片我们也可以是使用复用池,不过要自己实现,可以参考GlideBitmapPool,采用了LruBitmapPool算法,最近使用原则;其底层是HashMap+LinkedGroupMap.Entry的双链表结构,快速访问;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气好男人_Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值