内存管理最佳实践

一、内存管理原则

  1. 理解Android内存模型
    • 基于JVM垃圾回收机制,采用分代回收策略
    • 内存不足是触发onTrimMemory(),开发者需响应此回调释放资源
  2. 避免内存泄漏根源
    • 静态引用:禁止用static持有Activity/Context(用Application Context代替)
    • 非静态内部类:改用静态内部类+弱引用
    • 资源未释放:关闭Cursor、File、Bitmap等资源。gc只释放java对象本身,在jvm堆中,系统资源需要显示释放
    • 集合对象:及时清理无用的集合元素
  3. 优化关键组件
    • Activity/Fragment
      • 在onDestroy中解除BroadcastReceiver、Handler注册,移除回调
      • 避免在异步任务中直接引用View
    • Handler
      • 使用静态内部类 + WeakReference。
    • 单例模式
      • 传递Application Context,而非Activity Context
  4. 大对象优化
    • Bitmap
      • 使用inSampleSize压缩图片,采用Glide等库管理内存
    • 数据缓存
      • 优先使用LruCache和DiskLruCache

二、内存泄漏排查工具

  1. Android Profiler
  2. LeakCanary
  3. MAT
  4. StrictMode

二、内存泄漏排查工具

  1. Android Profiler(Android Studio)

    • 内存监控:实时查看堆内存使用情况。
    • Heap Dump:捕获堆快照,分析对象引用链。
    • Allocation Tracker:跟踪短时间内的内存分配。
  2. LeakCanary(自动化检测)

    • 集成步骤:

      debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
      
    • 自动检测泄漏并生成报告,定位泄漏引用链。

  3. MAT(Memory Analyzer Tool)

    • 分析Heap Dump步骤:

      • 用Android Profiler导出.hprof文件。

      • 通过hprof-conv转换格式(Android SDK工具):

        hprof-conv input.hprof output.hprof
        
      • 在MAT中打开,通过Dominator TreePath to GC Roots分析泄漏对象。

  4. StrictMode

    • 检测主线程磁盘/网络操作,间接避免内存问题:

      StrictMode.setVmPolicy(new VmPolicy.Builder()
          .detectActivityLeaks()
          .detectLeakedClosableObjects()
          .penaltyLog()
          .build());
      
使用 Hugo 构建
主题 StackJimmy 设计