Android面试必备:内存泄露、OOM、ANR解析

需积分: 10 10 下载量 122 浏览量 更新于2024-07-19 1 收藏 654KB PDF 举报
"Android面试笔记,包含了Android基础面试中常见的问题和知识点,如内存泄露、OOM异常、如何避免这些问题以及ANR的解析等。" 在Android面试中,开发者需要对系统的基本原理和常见问题有深入的理解。以下是这些知识点的详细说明: **内存泄露** 内存泄露是指应用程序中不再使用的对象无法被垃圾收集器正常回收,导致内存占用持续增加,可能影响应用性能或导致应用崩溃。根本原因是长生命周期的对象持有短生命周期的对象,使得短生命周期的对象不能及时释放。常见的内存泄露场景包括: 1. 静态集合类(如HashMap, Vector):静态成员变量会保持对对象的引用,即使对象不再使用,它们也不会被垃圾收集。 2. 监听器未移除:如注册了广播接收器但未unregisterReceiver,或者在Activity中添加的监听器未在退出时移除。 3. 数据库、IO流、Socket、Cursor未关闭:这些资源在使用后应及时关闭,以释放资源。 4. 匿名内部类:匿名内部类会隐式持有外部类的引用,如果这个内部类在长时间运行的线程中,可能导致外部Activity无法回收。 5. 单例模式:单例是一个全局静态对象,可能会导致其持有的对象无法被释放。 **避免OOM(内存溢出)异常** 由于Android应用的Dalvik/ART虚拟机内存有限,开发者需要采取措施减少内存消耗: 1. 使用ArrayMap/SparseArray代替HashMap,因为前者在内存使用上更优。 2. 避免在Android中使用枚举(Enum),因为它们在内存中占用较大。 3. 对Bitmap进行优化:通过设置inSampleSize来缩小图片尺寸,使用合适的decodeFormat以减少内存占用。 4. 减小资源图片的大小,可以使用.9.png来适应不同尺寸,减少内存开销。 **内存对象的重复利用** 1. ListView/GridView/RecyclerView的convertView复用机制:通过复用视图,减少对新对象的创建,降低内存压力。 2. 避免在onDraw方法中创建新对象:onDraw会被频繁调用,创建新对象会导致内存频繁分配和回收。 3. 使用StringBuffer代替字符串拼接(+):StringBuffer在拼接时效率更高,因为它是可变的,不会每次都创建新的字符串对象。 **ANR(应用无响应)** ANR是Android系统在主线程阻塞超过一定时间(通常5秒)后抛出的异常。这可能是由于UI线程中执行了耗时操作,导致用户界面无法响应。避免和解决ANR的方法包括: 1. 避免在主线程进行耗时操作,如网络请求、数据库查询等,应将这些操作放在子线程中执行。 2. 使用Handler、AsyncTask或IntentService处理异步任务。 3. 对于BroadcastReceiver,确保在onReceive()方法内快速完成工作并返回,避免阻塞主线程。 4. 调试时,检查Logcat中的ANR相关日志,找出引起阻塞的原因。 理解并掌握这些Android基础知识对于面试和实际开发都是非常重要的,能够帮助开发者构建高质量、稳定且高效的Android应用。