Android内存管理经验分享

WellMouth +0/-0 0 0 正常 2025-12-24T07:01:19 Android · 性能优化 · 内存管理

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回收。

解决方案

  1. 使用静态内部类 + 弱引用
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()) {
            // 处理消息
        }
    }
}
  1. 及时移除回调
@Override
protected void onDestroy() {
    super.onDestroy();
    mHandler.removeCallbacksAndMessages(null);
}

验证效果

  • 优化后,App后台运行1小时内存稳定在150MB左右
  • 使用LeakCanary检测,无内存泄漏报告
  • 用户反馈应用卡顿问题明显改善

小结

内存管理的关键在于:及时释放资源、避免持有不必要的引用、合理使用静态变量和弱引用。建议在项目中统一规范Handler使用方式。

推广
广告位招租

讨论

0/2000
柔情密语
柔情密语 · 2026-01-08T10:24:58
匿名内部类Handler确实是经典坑位,但别只想着用静态内部类,更推荐使用WeakReference+生命周期感知组件,比如LifecycleOwner配合ViewModel,这样既保证了内存安全又避免了手动removeCallbacks的繁琐。实际项目中我常把这类定时任务封装成一个独立的TaskManager,通过Application的生命周期管理来统一回收。
Paul383
Paul383 · 2026-01-08T10:24:58
除了Handler内存泄漏,还有个容易被忽略的点是AsyncTask,特别是网络请求场景下,如果AsyncTask持有Activity引用且未在onDestroy中cancel,也会导致内存泄漏。建议统一使用OkHttp+Callback的方式,并配合WeakReference处理回调结果,这样能从根源上规避大部分异步任务的内存问题。