内存管理最佳实践
一、内存管理原则
- 理解Android内存模型
- 基于JVM垃圾回收机制,采用分代回收策略
- 内存不足是触发
onTrimMemory()
,开发者需响应此回调释放资源
- 避免内存泄漏根源
- 静态引用:禁止用static持有Activity/Context(用Application Context代替)
- 非静态内部类:改用静态内部类+弱引用
- 资源未释放:关闭Cursor、File、Bitmap等资源。gc只释放java对象本身,在jvm堆中,系统资源需要显示释放
- 集合对象:及时清理无用的集合元素
- 优化关键组件
- Activity/Fragment
- 在onDestroy中解除BroadcastReceiver、Handler注册,移除回调
- 避免在异步任务中直接引用View
- Handler
- 使用静态内部类 + WeakReference。
- 单例模式
- 传递Application Context,而非Activity Context
- Activity/Fragment
- 大对象优化
- Bitmap
- 使用inSampleSize压缩图片,采用Glide等库管理内存
- 数据缓存
- 优先使用LruCache和DiskLruCache
- Bitmap
二、内存泄漏排查工具
- Android Profiler
- LeakCanary
- MAT
- StrictMode
二、内存泄漏排查工具
-
Android Profiler(Android Studio)
- 内存监控:实时查看堆内存使用情况。
- Heap Dump:捕获堆快照,分析对象引用链。
- Allocation Tracker:跟踪短时间内的内存分配。
-
LeakCanary(自动化检测)
-
集成步骤:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
-
自动检测泄漏并生成报告,定位泄漏引用链。
-
-
MAT(Memory Analyzer Tool)
-
分析Heap Dump步骤:
-
用Android Profiler导出
.hprof
文件。 -
通过
hprof-conv
转换格式(Android SDK工具):hprof-conv input.hprof output.hprof
-
在MAT中打开,通过Dominator Tree和Path to GC Roots分析泄漏对象。
-
-
-
StrictMode
-
检测主线程磁盘/网络操作,间接避免内存问题:
StrictMode.setVmPolicy(new VmPolicy.Builder() .detectActivityLeaks() .detectLeakedClosableObjects() .penaltyLog() .build());
-