美文网首页
2017.12.22三题

2017.12.22三题

作者: 吴国友 | 来源:发表于2017-12-27 17:07 被阅读1次
    1.什么情况下会导致内存泄漏

    内存泄漏的根本原因
    长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。
    1.静态JavaSE类引起内存泄漏主要是hashmap,Vector等,如果是静态JavaSE这些JavaSE没有及时setnull的话,就会一直持有这些对象。
    2.remove方法无法删除set集Objects.hash(firstName,lastName),经过测试,hashcode修改后,就没有办法remove。
    3.observer我们在使用监听的时候,往往是addXXXlistener,但是我们不需要的时候,忘记removeXXXlistener,就容易内存leak。广播没有unregisterrecevier。
    4.各种数据链没有关闭、数据库、io、sokect、cursor等。
    5.内部类:java中的内部类(匿名内部类),会持有宿主类的强引用this。所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。Context的引用,当TextView等等都会持有上下文的引用。如果有static drawable,就会导师制改内存无法释放。
    6.单例:单例是一个全局的静态对象,当持有某个复制的类A时,A无法被释放,内存leak。

    2.如何避免OOM异常

    首先OOM是什么?

    当程序需要申请一段“大”内存,但是虚拟机没有办法及时的给到,即使做了GC操作以后就会跑出OutOfMemoryException也就是OOM。Android的OOM怎么样?为了减少单个APP对整个系统的影响,android为每个app设置了一个内存上线。

    如何避免OOM
    最重要的肯定是你的程序没有语法、逻辑错误导致的OOM。然后使用一下方法尽量减少内存消耗:

    减少内存消耗

    • ArrayMap/SparseArray代替hashMap
    • 避免在android里面使用Enum
    • 减少bitmap的内存占用
    • inSampleSize:缩放比例,在把图片载入内存之前,算出合适的比例,避免不必要的大图载入。
    • 减少资源图片的大小,进行压缩,过大的图片可以考虑分段加载。

    内存对象的重复利用

    • 大多数对象的复用,都是利用对象池的技术
    • listview、gridview、recycleview contentview的复用。
    • inBitmap属性对于内存对象的复用。
    • 避免在ondraw方法里面new对象。
    • StringBuilder代替+。
    • 使用最近最少使用算法(Lrucache)等算法,利用时间换空间策略减少内存消耗。
    3.ANR是什么?怎么样避免和解决ANR?

    什么是ANR
    Application Not Responding,也就是在规定的时间内,没有响应。ANR有三种类型:
    1.KeyDispatchTimout(5s)--主要类型按键或触摸事件在特定时间内无响应。
    2.BroadcastTimeout(10s)--BroadcastReceiver在特定时间内无法处理完成。
    3.serviceTimeOut(20s)--小概率类型Service在特定的事件内无法处理完成。

    为什么会超时
    事件没有机会处理 & 事件处理超时。

    怎么避免ANR
    ANR的关键是处理超时,所以应该避免在UI线程,BroadcastReceiver还有Service主线程中,处理复杂逻辑和计算 而交给work thread操作。
    1.避免在activity里面做耗时操作
    2.避免在onReceiver里面做过多操作
    3.避免在IntentReceiver里启动一个activity,因为它会创建一个新的画面,并冲当前用户正在运行的程序上抢夺焦点
    4.尽量使用handler来处理UI thread&workthread的交互。

    相关文章

      网友评论

          本文标题:2017.12.22三题

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