Android内存优化

Android 系统将进程分为哪些类型?

  • 前台进程:系统进程或者正在前台运行的进程
  • 可见进程:可见但是不与用户交互的进程

引发 GC 操作的原因是什么?

  • 短时间内有大量频繁的对象创建与释放操作
  • 内存分配失败是触发GC_MALLOC

为什么要避免频繁的 GC 操作? 如何避免

  • GC 操作会导致系统所有的线程暂停。频繁的GC操作会导致UI卡顿,影响用户体验
  • 尽量避免在频繁触发的逻辑方法中大量的分配对象,如自定义View的onDraw中执行复杂的操作

常见的内存问题都有哪些?

  • 内存溢出OOM
  • 内存抖动:短时间内有大量频繁的对象创建和释放操作。
  • 内存泄漏

你在开发中都使用了哪些内存优化的工具?

  • Allocation Tracker:查看程序某段时间的内存分配情况,如内存抖动;查看某段程序运行结束后的内存分配情况,如内存泄漏。
  • DDMS-Heap:显示当前引用占用的内存,剩余的饿内存信息。

内存泄露是什么,如何解决?

  • 内存泄露就是一个对象被超过自己生命周期以外的对象强引用导致该对象无法被正 常垃圾回收
    • 外部类的静态变量持有了 Activity 对象。导致 Activity 退出后无法被系统回收
    • 加载大量的图片缓存在内存中,没有在当前页面退出后释放。
  • 常见的内存泄露导致问题
    • 应用卡顿,响应速度慢(内存占用高时 JVM 虚拟机会频繁触发 GC)
    • 应用莫名的崩溃
  • 如何解决内存泄露
    • 查找所有持有 Application 或 Activity 的静态变量的类,在这些类中编写释放持有 Activity、Application 的静态变量的方法,在 Activity.onDestroy()中调用该工具类的方法释放静 态变量持有的对象

内存抖动是什么,如何解决?

  • 内存抖动(Memory Churn)是因为在短时间内大量的对象被创建又马上被释放。
  • 如何解决内存抖动?
    • 避免在循环中大量创建对象,若使用大量对象,应使用对象池。如在循环中使用 Message 时,用 Message.obtain 方法从消息池中复用 Message
    • 尽量避免在 onDraw 方法中创建对
    • 在循环中连接字符串时,要使用 StringBuilder 或 StingBuffer,避免使用 String

内存溢出是什么,如何解决?

  • Android 的应用程序所能申请的最大内存都是有限的,内存溢出(OutOfMemoery)简称 OOM,是指 APP 向系统申请内存的请求超过了系统为应用分配的上限,系统无法再分配多 余的空间,就会造成 OOM。
  • OOM 解决
    • 通过 BitmapFactory.options 压缩图片尺寸。
    • 通过 BitmapFactory. inPreferredConfig 控制图片的质量,例如将图片每个像素 默认的字节数由 Bitmap.Config ARGB_8888 改为 Bitmap.Config.RGB_565
    • 为防止 OOM 造成的异常,用 try-catch(OutOfMeory e)捕获 OOM 异常

你在开发中都使用过哪些内存优化措施?

  • 大图片加载的三种优化措施
    • 通过 BitmapFactory.options 压缩图片尺寸
    • 通过 BitmapFactory. inPreferredConfig 控制图片的质量
  • 在多个 Activity 或 Fragment 都可能加载大量图片时
    • 在当前 Activity.onStop 方法中调用 Bitmap.recycle 方法释放当前 Activity 中的所有 Bitmap
  • 在加载大图片时,为防止 OOM 造成的异常,用 try-catch(OutOfMeoryError e)捕获 OOM 异常
小额支持我写出更好的文章~