Android 内存优化面试题

184 阅读2分钟
  • 堆分为Java堆和native堆,Java堆是一块共享内存,安卓把它封装成了一个spaces,它其实由底层libc的malloc和free来进行申请内存和释放内存
查看一个app的内存

adb shell dumpsys meminfo 包名

内存优化的目的
  1. 降低OOM、抖动和泄漏
  2. 提高app流畅度
  3. 减少内存占用提高后台存活率
Java回收
  1. Java的垃圾回收算法是G1(1.7开始1.9默认),分新生代和老年代。并发和并行、高效的回收、尽量在后台回收。
  2. 强、软、虚、弱四种引用类型
  3. 可达性分析算法
内存优化
  1. 内存泄漏:本来释放的内存被占用
  2. 内存抖动:短时间触发大量对象的创建与回收,容易触发GC。通常会暂停所有线程的执行,这样GC可能会导致卡顿。使用对象复用来解决,比如消息队列里的MessagePool
  3. 内存溢出:单次分配内存过大、线程数量过多、进程数量过多、多次分配内存导致内存不足、fd超过限制(导致崩溃)。
内存优化工具
  1. Android profiler

  2. MAT

  3. Visiual VM

内存监控工具
  1. matrix 通过hook技术来监控app的使用情况,并生成文件来上报
  2. Koom 使用多进程来优化了;生成的文件很小
  3. Visiual VM
  4. leakcanary
  5. probe
常规的内存优化
  1. 良好的代码设计和适合的数据结构、设计模式
  2. 对象的复用 对象池、Parcelable
  3. 资源的复用
  4. 压缩图片
图片(bitmap)

bitmap:分为引用存储在Java堆内存和像素内存存储在native。

  1. 像素格式: AGB565 2个字节 ARGB888 4个字节

  2. glide、

  3. 资源目录不同,占用内存不同

  4. 根据设备可用内存不同的配置不同的策略

  5. 大图监控:hook onResourceReady, Epic

  6. bitmapFractory.options

    1. inSampleSize
    2. inJustDecodeBound = true 解析宽高
    3. inMutable 可以被修改,从而复用bitmap
内存泄漏

生成周期长的持有短的,导致短的无法被回收,打断引用链即可。

  1. 资源被关闭
  2. 监听应该成对出现
  3. 系统bug inputMethodManger
  4. webView 内存泄漏。多进程
  5. 线程泄漏
  6. View 不要使用静态声明,使用application
  7. 内部类:使用静态内部类,谨慎使用匿名内部类; kotlin的匿名内部类,如果未引用外部类则在编译成字节码后会生成改为静态内部类。所以不会内存泄漏。Java要小心