Android内存优化方向

  1. 避免内存泄露

    内存泄露是造成OOM的最主要原因
    常见的内存泄露:
     1. 单例  因为单例是全生命周期的,如果引用了非全生命周期变量,就会导致内存泄露
    
     2. 静态变量  同样也是生命周期长
    
     3. Handler  因为非静态内部类会持有外部类的引用,Activity destroy之后由于消息队列还存在消息,handle对象无法被回收,就造成activity也无法销毁;解决方案是使用静态内部类创建handle,并在页面退出的时候清空消息队里
    
     4. 资源使用完未关闭 比如BraodcastReceiver,ContentObserver  io流 bitmap等等;解决方案就是及时关闭释放
    
    开发阶段可以使用工具来实时监测我们的程序是否有内存泄露:LwakCanary
    
  2. 优化图片的内存占用

    除了内存泄露,引发oom的第二大问题就是图片的内存占用
     1. bitmap   有时候我们需要直接对bitmap进行操作,可以基于软引用自己实现一个bitmap缓存池,这样对于同一个图片,bitmap对象会重复使用(例如默认图);这也是glide内部的做法;我们在使用context.getResources().getDrawable获取图片时,系统内部也维持了一个bitmap缓存池(由算法处理,一般是lru算法)
     
     2. 图片压缩     在使用BitmapFactory解码时,我们可以通过配置参数对待加载的图片进行调整,一般有降低分辨率、改变加载模式(ARGB_8888==>RGB565)等
     
     3. 在低级设备上加载更小的图片,比如使用纯色背景,使用更低分辨率的图片
    
  3. 避免内存抖动

    内存在频繁的分配和回收时会造成gc频繁工作,会导致卡顿,严重时会引发OOM
    
    例如在循环中频繁拼接String对象,会造成内存抖动;解决方案是采用StringBuffer和StringBuilder
    
  4. 其它优化

    除了以上几个比较大的情况会引发内存问题外,还有一些其它细节也会引发内存问题,需要有针对性的优化
    
    1. 数据结构优化    在Android中使用SparseArrayMap和ArrayMap替代HashMAp
    
    2. 避免使用枚举
    
    3. 列表复用(listview和recycleview)
    
    4. 减少是视图的层级
     1. 使用constraintlayout替代线性布局和相对布局
     2. 使用viewstub标签延迟初始化视图
     
    5. 将一些复杂计算及占用内存的操作放到native层处理,比如音视频解码
    

工具

  1. LeakCanary监测内存泄露
  2. MAT分析内存占用
  3. Android监测内存实时情况,监测内存抖动
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • HereAndroid的内存优化是性能优化中很重要的一部分,而避免OOM又是内存优化中比较核心的一点。这是一篇关于...
    HarryXR阅读 3,801评论 1 24
  • 本文转载来源 http://www.csdn.net/article/2015-09-18/2825737/1 (...
    yoosir阅读 1,081评论 0 5
  • Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心。 Android内存管理机制 ...
    lwwlsky阅读 19,938评论 4 46
  • 如何避免OOM 一、减小对象的内存占用 1、使用更加轻量的数据结构 例如,我们可以考虑使用ArrayMap/Spa...
    吕侯爷阅读 733评论 0 5
  • 车水马龙,川流不息,偌大的城市,孤独的内心,只填满眼前的工作,却早已忘记了生活本来的滋味。 这样的夜晚,一个又一个...
    兮兮码字的地方阅读 216评论 0 3