Android内存管理经验分享
踩坑记录:内存泄漏引发的血案
最近项目中遇到一个诡异的内存问题,App在后台运行几分钟后就会被系统强制回收。经过一番排查,定位到一个典型的内存泄漏场景。
问题现象:
- 手机后台切换应用时,App内存占用持续增长
- 使用Android Profiler监控发现堆内存持续上涨
- 重启后内存恢复正常,但再次运行后又复发
核心问题分析
在Activity中使用了匿名内部类的Handler导致内存泄漏:
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 处理消息
}
};
private void startTask() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// 业务逻辑
doSomething();
}
}, 5000);
}
}
问题原因:匿名内部类持有外部Activity引用,当Activity销毁时,Handler仍持有该引用,导致Activity无法被GC回收。
解决方案
- 使用静态内部类 + 弱引用:
private static class MyHandler extends Handler {
private WeakReference<MainActivity> mActivity;
public MyHandler(MainActivity activity) {
mActivity = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = mActivity.get();
if (activity != null && !activity.isFinishing()) {
// 处理消息
}
}
}
- 及时移除回调:
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
验证效果
- 优化后,App后台运行1小时内存稳定在150MB左右
- 使用LeakCanary检测,无内存泄漏报告
- 用户反馈应用卡顿问题明显改善
小结
内存管理的关键在于:及时释放资源、避免持有不必要的引用、合理使用静态变量和弱引用。建议在项目中统一规范Handler使用方式。

讨论