美文网首页
【性能优化】Android中比较常见的内存泄露

【性能优化】Android中比较常见的内存泄露

作者: 蜗牛是不是牛 | 来源:发表于2023-05-09 14:33 被阅读0次

    1.单例

    单例所导致的内存泄漏几乎是在android开发中最为常见的内存泄漏问题了。

    public class Singleton {
    private static Singleton singleton;
    private Context context;
    private Singleton(Context context) {
    this.context = context;
    }
    public static Singleton getInstance(Context context) {
    if (singleton == null) {
    singleton = new Singleton(context);
    }
    return singleton;
    }
    }
    

    在上面的代码中,如果在执行 getInstance 方法的时候,传入的是activity的对象,那么该activity对象就没法被及时回收,导致内存泄漏,可以考虑传入ApplicationContext,或者把context放入到方法变量中。

    2.非静态内部类(包括匿名内部类)

    非静态内部类会默认持有外部类的引用,如果它的生命周期长于外部类时,就会导致内存泄漏。 在android开发,这种情况常常见于Handler的使用。

    • 尽可能避免使用静态变量
    class MainActivity : AppCompatActivity() {
    companion object {
    @JvmStatic
    private var info: StaticInfo? = null
    }
    override fun onCreate(savedInstanceState: Bundle?) {
    info = StaticInfo(this)
    }
    class StaticInfo(activity: MainActivity) {
    }
    

    在上述代码中, info 是一个静态变量,但是它持有了 activity 的引用,由于静态变量的生命周期要比 activity的生命周期长,导致 activity 无法及时回收,造成内存泄漏。

    • 资源未关闭造成的内存泄漏

    诸如cursor、inputStream等对象一定要注意及时关闭

    try {
    }catch (e:Exception) {
    }finally {
    // 可以在finally方法里把cursor等对象进行关闭
    }
    
    • 集合中的对象未及时清理造成的内存泄漏
    val list = ArrayList<Activity>()
    

    例如,如果一个list中存放的是activity对象,就会可能导致activity无法及时回收。如果该list是静态对象的话,不及
    时移除activity的话,就更会产生内存泄漏了。

    • webview造成的内存泄漏

    因为webview在加载完网页后,它的callback会持有activity的引用,造成webview的内存无法释放。可以在activity的onDestroy()方法中移除该webview,并调用webview.destroy()。

    • 未取消注册或回调造成的内存泄漏

    在android中回调是使用非常多的,但如果在注册回调的时候,传入了context对象,则需要注 意及时取消回调,否则就可能会出现内存泄漏。例如eventbus和广播。

    相关文章

      网友评论

          本文标题:【性能优化】Android中比较常见的内存泄露

          本文链接:https://www.haomeiwen.com/subject/kpkgkdtx.html