Android开发-细节决定性能

最近换了个新的团队,刚刚入职的一段时间没有分配太多的工作,主要是熟悉代码和其他一些流程,在开需求评审会议的时候说到了性能优化的问题,但是这个由于开发任务的影响并没有安排人去做,那么我就自己默默的利用MAT和DDMS去对产品进行了性能分析,具体分析的过程和方法我就不想在这里花很多时间介绍了,主要总结一下出现问题是对我们平时编程的启示。

内存泄漏

一、单例对象的滥用

关于单例造成的内存泄漏,网上说的太多了。主要原因大部分都是Activity对象被单例类持有、Handler持有等,其实我在项目中发现的就是单例持有,但是比较隐蔽,我来说一下发现泄漏的地方,以及对我们开发的启示。泄漏发生的示意图如下:

对象创建依赖

这里可以很直接的看到在创建A对象时将Activity作为参数传递到A中使用,但是在A中又创建了B对象,并且B的构造函数包含Context,这个时候很自然的用了A中的Activity作为参数创建了B对象,但是这个时候麻烦来了,在B中创建了C对象并且改类是单例类,这个时候这个单例类就持有了Activity,那么这个时候如果退出改Activity就有可能存在泄漏。这里就以上这个发现的代码我想总结一下我们平时开发时需要注意的细节:
1.在创建类的时候不要轻易的将Activity作为构造函数的参数
 通过上面的问题我们可以发现,当你把Activity作为某个类的参数传递进去的时候,在该类中对Activity的使用有可能会失去控制(如上面所示)。如果非要使用Activity作为参数或者代码中已经这样了,可以尝试着在该类中创建两个成员变量:mActivity和mContext,这里的mContext可以通过Application的Context。
2.在使用单例类时,获取对象的方法尽量不要含有参数
 如上泄漏问题,如果类C的getInstance方法不需要Context作为参数,那么就不会存在问题,具体关于单例类的使用网上的文章已经很多了。

二、谨慎使用try catch

 我们在日常开发的时候会遇到一些我们无法解决的crash问题,或者说是不容易处理的bug,很多小伙伴估计会考虑使用try catch的方法将异常捕获,从而达到程序正常运行并且crash率也会较低,但是如果处理的不是很恰当的话也会导致内存泄漏问题。这段时间在检查程序内存泄漏问题的时候就发现了这样一个问题;通过WindowsManager对象添加一个View并显示出来,但是在跑monkey的时候不知道在什么情况下出现了crash问题,由于很难复现这个问题,也没有很好的定位到问题所在,所以我的小伙伴就想着直接try catch。但是,这个时候问题来了,通过MAT我发现了下面的问题

合理释放创建的线程

在开发应用的时候,为了处理耗时的操作时我们一般会启动新的线程,如果对这些线程不能很好的处理的话,也会带来相应的性能损耗。在查看性能时我也会通过android studio的monitor工具查看应用的线程数量和线程状态,如下图所示查看:

查看线程

 我通过该方法在查看团队开发的应用时,发现我进入某个页面的时候就会创建一个新的线程,而退出这个页面的时候该线程就处于等待状态,当我不停的进入退出就会有大量的线程处于等待状态,这个线程创建的位置也比较好定位,因为该线程的名字就是该类的名字(所以我建议在创建线程的时候最好可以setName,方便以后定位问题)。最终发现该类中创建了HandlerThread对象,该类的细节就不介绍了,当调用HandlerThread中的start方法的时候就会创建Looper对象并启动loop,阻塞等待Message消息。通过这个问题我先总结一下两点:

1.在利用HandlerThread创建线程的时候,当不在使用该线程的时候一定要调用quit或者quitSafely方法停止Looper的阻塞状态,从而释放Thread资源。

2.上面说的是关于HandlerThread,那么其他的还有没有?当然是有的,我记得在上一个团队的时候也发现是类似的问题,但是是启动的线程池。当时是启动的一个后台的Service干活,在该Service中启动的一个线程池,但是在退出Service时没有将该线程池释放,导致启动的线程池中的线程处于等待状态。当再次启动Service的时候又会创建线程线程池对象,启动新的线程,这样就容易造成资源的消耗。

如有问题欢饮讨论,后面继续补充其他!

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

推荐阅读更多精彩内容