每日一题: 内存优化

作者: 林锐波 | 来源:发表于2017-07-24 17:22 被阅读170次

    每日一题: 内存优化

    内存泄漏检测
    MAT、DDMS 等内存查看工具

    面试率: ★★★★☆

    面试提醒

    内存优化?现在的APP已经是家喻户晓的事情了,不再像以前一样只有大公司才能有自己的产品,基本中小型公司只要是打算进军移动互联网的都会有自己的app,因此在成千上万的app中要脱颖而出,靠的不是你广告打的多响,更重要的是产品的健壮性,因此内存优化是面试中不可避免的一题.

    面试技巧

    在面试过程中,只要被问到内存优化相关问题,一般都会真直觉的讲什么原因会导致这个问题,如io流,游标操作,图片处理等...
    然而这些并不能证明你真的接触过这块知识,外面百度下Android内存优化一大堆这样的文章.
    如何是好?
    面试官真正想要的是,你在项目中如何定位解决内存优化这个过程,详情看看下面的面试题.

    面试题

    下面是记一次检测并定位内存泄漏的过程,我把这个过程的一些关键问题提取出来.

    Eclipse如何检测内存泄漏这块的,DDMS和MAT使用过吗?

    比较麻烦,要经过debug,logCat,Console

    什么是内存泄漏?

    Android虚拟机的垃圾回收采用的是根搜索算法。GC会从根节点(GC Roots)开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉。而内存泄漏出现的原因就是存在了无效的引用,导致本来需要被GC的对象没有被回收掉。

    举个会导致OOM栗子?

    1. 使用static修饰的对象,当Activity需要被销毁时,由于被静态对象所持有,所以系统不会对其进行GC,这样就造成了内存泄漏
    2. 工具类里的单例模式,在getInstance()方法时传入了Activity。那么当instance没有释放时,这个Activity会一直存在。因此造成内存泄露

    解决方法可以将new Singleton(context)改为new Singleton(context.getApplicationContext())即可,这样便和传入的Activity没关系了。

    AS有没提供什么检测OOM的方法,Android Monitor使用过没?

    通过Reference Tree(该实例的引用),可以从这里面查看内存泄漏的原因,Shallow Size指的是该对象本身占用内存的大小,Retained Size代表该对象被释放后,垃圾回收器能回收的内存总和。

    平时如何操作AM的?

    其实操作很简单,主要4步骤.

    1. 手动GC
    2. 查看信息 JavaHeap
    3. 分析信息 Analyzer Task
    4. 定位问题 (解决问题)

    相关文章

      网友评论

        本文标题:每日一题: 内存优化

        本文链接:https://www.haomeiwen.com/subject/eegbkxtx.html