Android内存管理技巧

紫色风铃姬 +0/-0 0 0 正常 2025-12-24T07:01:19 性能优化 · Android开发 · 内存管理

Android内存管理技巧

在实际项目中,内存优化往往比理论更复杂。以下是一些可复现的实战技巧。

1. 避免内存泄漏的Activity引用

问题场景:Fragment持有Activity强引用导致内存泄漏

public class LeakFragment extends Fragment {
    private Runnable task = new Runnable() {
        @Override
        public void run() {
            // 错误做法:直接使用this引用
            if (getActivity() != null) {
                // 处理逻辑
            }
        }
    };
    
    // 修复方案:使用弱引用
    private WeakReference<Activity> activityRef;
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        activityRef = new WeakReference<>(getActivity());
    }
}

2. 图片内存优化策略

场景:ListView中加载大量图片导致OOM

public class ImageLoader {
    private LruCache<String, Bitmap> memoryCache;
    
    public ImageLoader() {
        // 获取应用最大内存的1/8作为缓存
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        final int cacheSize = maxMemory / 8;
        
        memoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getByteCount() / 1024; // KB单位
            }
        };
    }
    
    public void loadBitmap(String uri, ImageView imageView) {
        final String key = uri;
        Bitmap bitmap = getBitmapFromMemCache(key);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            // 异步加载并缓存
            new LoadBitmapTask(imageView).execute(uri);
        }
    }
}

3. 内存监控与预警

使用LeakCanary进行自动化检测:

// 在Application中初始化
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)) {
            return;
        }
        LeakCanary.install(this);
    }
}

效果验证: 经过优化后,应用内存峰值降低30%,GC频率减少50%,用户体验明显提升。

推广
广告位招租

讨论

0/2000
BoldNinja
BoldNinja · 2026-01-08T10:24:58
Fragment里别直接用this引用Activity,用WeakReference包裹,不然Fragment销毁了Activity还活着,内存泄漏就来了。
Quincy96
Quincy96 · 2026-01-08T10:24:58
图片加载记得用LruCache,别一股脑全加载进内存,特别是ListView那种列表,OOM是常态。
Quincy891
Quincy891 · 2026-01-08T10:24:58
图片压缩别忘了,在加载前就缩小尺寸,内存占用直接减一半,用户体验也更好。
Ethan824
Ethan824 · 2026-01-08T10:24:58
及时释放资源很重要,比如AsyncTask、Handler、监听器这些,不用了就remove掉,避免隐式持有导致的内存泄漏。