Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android内存泄漏优化

Android应用内存泄漏优化指南

作者:QING618

内存泄漏(Memory Leak)是指应用中不再使用的对象因错误引用无法被垃圾回收(GC),导致内存占用持续增长,最终可能引发 OOM(Out Of Memory)崩溃 或 应用卡顿,以下是 Android 内存泄漏的优化方案,涵盖检测工具、常见场景及解决方案,需要的朋友可以参考下

一、内存泄漏检测工具

1、Android Profiler(Android Studio 自带)

2、LeakCanary(第三方库)

dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

3、MAT(Memory Analyzer Tool)

使用流程

二、常见内存泄漏场景与代码示例

1、静态引用 Activity/Context

错误代码

class AppManager {
    companion object {
        var activity: Activity? = null // 静态持有 Activity
    }
}

// 在 Activity 中赋值
AppManager.activity = this

泄漏原因:静态变量生命周期长于 Activity,导致 Activity 无法释放。

解决方案

// 使用静态内部类 + 弱引用
class MyActivity : Activity() {
    private class SafeHandler(activity: MyActivity) : Handler(Looper.getMainLooper()) {
        private val weakActivity = WeakReference(activity)

        override fun handleMessage(msg: Message) {
            weakActivity.get()?.handleMessage(msg)
        }
    }

    private val handler = SafeHandler(this)
}

2、匿名内部类(Handler、Runnable)

错误代码

class MyActivity : Activity() {
    private val handler = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            // 引用 Activity
        }
    }
}

泄漏原因:匿名内部类隐式持有外部类(Activity)引用。

解决方案

// 使用静态内部类 + 弱引用
class MyActivity : Activity() {
    private class SafeHandler(activity: MyActivity) : Handler(Looper.getMainLooper()) {
        private val weakActivity = WeakReference(activity)

        override fun handleMessage(msg: Message) {
            weakActivity.get()?.handleMessage(msg)
        }
    }

    private val handler = SafeHandler(this)
}

3、匿名内部类(Handler、Runnable)

错误代码

class MyActivity : Activity() {
    override fun onCreate() {
        super.onCreate()
        registerReceiver(receiver, IntentFilter("MY_ACTION"))
    }

    private val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {}
    }
}

泄漏原因:未在 onDestroy() 中解注册 BroadcastReceiver

解决方案

override fun onDestroy() {
    unregisterReceiver(receiver)
    super.onDestroy()
}

4、单例模式持有 Context

错误代码

class Singleton private constructor(context: Context) {
    companion object {
        private var instance: Singleton? = null

        fun getInstance(context: Context): Singleton {
            if (instance == null) {
                instance = Singleton(context.applicationContext) // 使用应用上下文
            }
            return instance!!
        }
    }
}

正确实践:单例中应使用 Application Context,避免持有 Activity Context。

5、资源未关闭(Cursor、File、Bitmap)

错误代码

fun loadBitmap(): Bitmap {
    val options = BitmapFactory.Options()
    return BitmapFactory.decodeResource(resources, R.drawable.large_image, options)
}

泄漏原因:未及时回收大图资源。

解决方案

override fun onDestroy() {
    bitmap?.recycle()
    super.onDestroy()
}

三、优化策略总结

1、避免静态引用 Activity:

2、正确管理生命周期:

3、优化匿名内部类:

4、单例模式注意事项:

5、工具辅助检测:

四、高级技巧

1、避免 ViewModel 泄漏

2、使用 WeakHashMap

    private val cache = WeakHashMap<Key, WeakReference<Bitmap>>()

3、监控 Fragment 泄漏

五、其他注意事项

六、总结

内存泄漏优化是 Android 性能调优的核心环节。通过 工具检测 + 代码规范 + 架构设计 的综合手段,可有效减少泄漏风险。关键点总结:

以上就是Android应用内存泄漏优化指南的详细内容,更多关于Android内存泄漏优化的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文