ANR
-
1: 什么是ANR :
- Application Not Responding
-
2: 造成ANR的原因:
- 应用程序的响应性是由 Activity Manager 和 WindowManager 系统服务监视的。
- 主线程被IO操作阻塞
- 主线程存在耗时的计算
-
3: 造成ANR的主要原因-Android中的哪些操作是在主线程中的。
- Activity的所有生命周期回调都是执行在主线程中的。
- service默认执行在主线程中。
- BroadcastReceiver 的OnReceive回调是执行在主线程中的。
- 没有使用子线程的Looper的Handler 的HandleMessage,post( Runnable) 是执行在主线程中的。
- AsyncTask的回调中除了doInBackground,其他都是执行在主线程。
-
4: 如何解决ANR
- AsyncTask处理耗时IO操作。
- 使用Thread或者HandlerThread 提高优先级。
- 使用handler来处理工作线程的耗时任务。
- Activity 的onCreate和 onResume回调中尽量避免耗时的代码。
OOM
-
1: 什么是oom
- 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出的Out of memory现象。
-
2: 一些容易混淆的概念
- 内存溢出: 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出的Out of memory现象
- 内存抖动:短时间创建大量对象,然后马上释放,瞬间产生的对象会严重占用内存。当达到阀值,触发GC。
- 内存泄漏: Java或者Android中,引用没有回收的对象。导致自己无法被释放。
-
3:如何解决oom
- 有关bitmap:
- 滑动停止加载大图。
- 及时释放内存。
- 图片压缩。
- inBitmap属性。
- 捕获异常。
- 其他方法
- listView: convertView / lru
- 避免在OnDraw方法里边执行对象的创建
- 谨慎使用多线程
- 有关bitmap:
UI卡顿
- 1: 原理分析
- 60fps —> 16ms 每隔16ms发出消息,触发界面渲染。操作很复杂,造成界面卡顿。
- 2:UI卡顿原因分析
- 1、人为在UI线程中做轻微耗时操作,导致UI卡顿。
- 2、布局Layout过于复杂,无法在 16ms内完成渲染。
- 3、同一时间动画执行的次数过多,导致CPU 或者GPU负载过重。
- 4、View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或者GPU负载过重。
- 5、View频繁的触发measure 、layout ,导致measure 、layout 累计耗时过多及整个View频繁的重绘。
- 6、内存频繁的触发GC过多,导致暂时阻塞渲染操作。
- 7、冗余资源及逻辑等操作导致加载和执行缓慢。
- 8、ANR
内存泄漏
一 :java中的内存泄漏基础知识
-
java内存的分配策略
静态存储区 : 存储的变量在程序运行期间都存在。
栈区: 被方法执行的时候,方法中执行的局部变量 ,会在栈上创建空间,方法结束之后这些变量持有的空间会被自动释放 。栈内存分配运算,内置于处理器当中,效率很高。但是栈区的空间是有限的。
堆区:动态内存分配。通常New 出来的对象在堆区。当对象不使用的时候,将由Java的垃圾回收器来负责回收。
-
java是如何管理内存的
- 对象的分配和释放问题。
-
Java中的内存泄漏
- 内存泄漏是指无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的空间内存浪费。
二 :Android中的内存泄漏基础知识
-
单例导致的内存泄露
-
匿名内部类
Handler的使用
避免使用 static 变量
资源未关闭造成的内存泄漏
AsyncTask造成的内存泄漏