记录一次Android内存优化

记录一次内存优化的过程,总结经验,若有错误纰漏欢迎指出。本次优化主要分为两部分:内存泄漏问题和内存不合理的开销。本次主要使用的分析工具为 Android Profiler ,具体使用方法文章众多,不做阐述。

内存泄漏

内存泄漏可以理解为一个对象存在的生命周期大于实际期望的生命周期。如 Activity 退出后仍被单例对象引用。

案例1:OpenGL 纹理重复创建

实际问题:项目中一个动画效果使用 OpenGL 实现,每次创建动画都会调用 glGenTextures() 重新生成纹理、分配 ID,导致内存泄漏。

解决办法:一次创建好纹理后不再重复创建。

NOTE:虽然内存不会因为动画创建而持续增长,但仍有存疑:第一次创建好的纹理是否也无法在页面退出后正确释放。

案例2:互相引用

实际问题:Activity 中各种 Manager 与 Activity 相互强引用,Activity 无法释放导致泄漏。

解决办法:a)Manager 使用弱引用来引用 Activity。b)可手动管理释放 Manager 对 Activity 的引用。

案例3:注册监听后没有正确释放

实际问题:在 Activity 中注册 PhoneStateListener ,Activity 销毁后没有移除注册。典型的匿名内部类、非静态内部类的泄漏问题。

解决办法:页面退出时移除注册 telephonyManager.listen(mOnePhoneStateListener, PhoneStateListener.LISTEN_NONE); 

不合理开销

案例1:视图懒加载

实际问题:引导蒙层、错误视图等都使用了尺寸较大的图片,而引导蒙层用户只有第一次使用功能时需要展示,错误视图如在成功加载数据后不会有机会展示。 

解决办法:使用 ViewStub 懒加载,而非 VISIBLE、GONE 控制展示与否。

案例2:减少不必要的 Bitmap 开销

设计可能会给出组合或层叠两张或多张图片的 UI 效果。这些 Bitmap 都是占内存的,尽量使用一张图搞定。

资源文件只打包了xxhdpi的,较大的图片在适配不同大小的控件、屏幕时使用 Glide 加载,优化图片的内存占用。

案例3:默认图、占位图的释放

在请求服务端图片资源成功前、高斯模糊完成展示前,通常会先使用一张图片去做默认的展示,在上诉操作完成并展示后释放掉不再需要的默认图。


上诉为实际中碰到的案例,总结问题模式:

1)OpenGL 不要重复创建纹理。

2)其他类持有 Context 对象 (非 ApplicationContext)请使用弱引用,否则需要手动释放对 Context 的引用。

3)注意匿名内部类、非静态内部类潜在的泄漏模式。

4)视图懒加载,使用 ViewStub 在需要的时候加载视图。

5)不要使用层叠 Bitmap 实现 UI 效果,会多出一倍的内存开销。

6)使用 Glide 优化图片加载的内存使用。

7)较大的默认图、占位图手动释放。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,129评论 25 707
  • Android 内存管理的目的 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。简单粗...
    晨光光阅读 1,294评论 1 4
  • 001曾经也是一个不撞南墙不回头的少女,曾经也说过“我肯定不会怎样怎样”,“打死也不怎样怎样”这样的坚决的话,曾经...
    小碗月牙阅读 335评论 2 2
  • 今天早上上班前,将最近收拾出来的户外背包和帽子挂到南海大道下的爱心墙上。刚刚挂完转身就听到后面有个老阿姨说:“这个...
    悠悠心旅阅读 347评论 0 0
  • 天很冷,刺骨的北风“嗖嗖”地直往脖子里钻,吹乱了我的头发。我缩着身子,手插在口袋里,冰凉的指尖,握成拳头,却...
    张玲芳阅读 239评论 0 2