美文网首页
内存泄漏&内存溢出

内存泄漏&内存溢出

作者: _爱笑的eyes | 来源:发表于2019-06-12 15:00 被阅读0次

内存溢出

1.什么是oom?

当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会

  抛出out of memory 异常,(大部分oom都与bitmap有关)

2.如何解决oom?

有关bitmap:

1.图片显示,当图片显示缩略图时,不要去网络请求加载大图

2.即时释放内存(释放C内存)

3.图片压缩

4.inbitmap属性,可提高Android属性在bitmap的分配和释放效率

5.捕获异常,在实例化bitmap时一定要对out of memory进行异常的捕获

其他方法:

1.listview:convertview/lru

2.避免在onDraw方法里执行对象的创建

3.谨慎使用多线程

内存泄漏

什么是内存泄漏?

某个不再使用对象由于被其他实例引用,导致不能被垃圾回收器回收,而导致内存不能释放。

常见的内存泄漏:

1.handler耗时引发的内存泄漏

当activity当中存在handler接收耗时的消息时,比如我们一般在网络请求切换线程时,经常使用到handler,假设消息还没有发送完成,但是页面已经被关闭,也就说activity已经执行了onDestroy方法。当gc回收时,会出现改activity不能被回收的情况,导致内存泄漏。

解决办法:当activity销毁的时候,调用handler的removeCallbacksAndMessages方法,移除消息任务,然后将handler对象及线程置空。

2.内部类引发的内存泄漏(当然handler或子线程一般也作为内部类使用)

因为java当中,内部类默认持有外部类的引用,当外部类销毁后,一旦gc回收该实例,发现内部类持有他的引用而导致不能回收该实例,出现内存泄漏的情况。

解决方法:将内部类改为静态内部类,因为静态内部类生命周期和应用一样长,所以当退出程序的时候会一同回收该实例,并不会影响外部类的回收。

3.单例导致的内存泄漏

因为在使用单例的时候,经常会传入一个本类的上下文对象,而单例是静态的,生命周期和application一样长,当activity销毁的时候,该单例持有activity的引用导致其不能被回收,出现内存泄漏。

解决方法:在使用上下文的时候,传全局上下文。

4.Timer计时器、动画,因为这些涉及耗时问题,如果activity销毁,而该任务并未执行完成,会导致内存泄漏。所以一般在activity中如果使用到这些耗时任务,需要在activity销毁时,做对应处理,比如调用timer的cancel方法,或者动画的cancel方法并将对象置空

5.一些监听器的内存泄漏

比如说我们给edittext设置输入文字监听时,当监听到文字发生变化,我们通过获取变化后的文字执行了耗时任务(比如获取到edittext里的内容上传服务器),当耗时任务未执行完成activity销毁了,会引发内存泄漏,所以在onDestory时,取消注册,比如说editText调用removeTextChangedListener方法 。

6.Rxjava的内存泄漏

因为rxjava采用的是观察者模式,当请求到数据后会根据订阅关系将数据发送个订阅者,而如果这时订阅者已经销毁,就会出现引用该对象导致其不能被回收的情况,出现内存泄漏,rxjava2发布的时候也发现了这个问题,所以在回调当中,新增加了onSubcribe回调,同时返回了一个disposable对象,可以通过判断disposable里的isDisposed来确定当前的订阅关系,如果订阅关系中的订阅者已经不存在且当前订阅关系存在,解除订阅关系,并终止数据的发送。

7.webView引发的内存泄漏

因为webview在使用的时候一般持有activity的引用,我们一般在activity的onDestroy方法中调用mWebView.destroy();来释放webview。如果在onDetachedFromWindow之前调用了destroy那就肯定会无法正常反注册了,也就会导致内存泄漏。所以在销毁webview前一定要先在onDetachedFromWindow中将webview从它的父view中移除,再调用destroy方法中调用webview的destroy,我开发的时候在5.1以上的手机上发现这种问题比较多,因为现在5.1以下适配的比较少了,基本没咋注意。

8.线程导致的内存泄漏

一般使用子线程都会创建一个内部类对象,而创建线程一般执行耗时任务,所以这个内部类默认持有外部类的引用,如果耗时任务在activity销毁的时候未执行完成,会因为持有外部类引用导致外部类不能被回收。

相关文章

  • 内存溢出和内存泄漏

    1.内存泄漏 2.内存溢出 -如何避免内存泄漏、内存溢出?

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • 【Android测试】内存泄漏检测 LeakCanary

    什么是内存泄漏和内存溢出?内存泄漏有什么危害?LeakCanary检测内存泄漏? 内存泄漏(Memory Leak...

  • JVM

    1. 内存溢出和内存泄漏 内存溢出是说程序需要申请的内存超过了JVM当前可以分配的最大内存,溢出。内存泄漏是说期望...

  • Android性能优化 内存泄漏和内存溢出

    内存泄漏 内存溢出 常见的内存泄露场景 常见的内存溢出场景

  • 【JVM】内存溢出分析

    一 内存溢出概述 都有发生内存溢出异常(OutOfMemoryError,简称OOM)的可能。 内存溢出和内存泄漏...

  • 使用 Memory Profiler 排查内存泄露

    使用 Memory Profiler 排查内存泄漏 内存泄漏和内存溢出 **Memory Profiler **是...

  • 面试题-第一期

    内存泄漏&&内存溢出 参考博客参考博客 先来看看内存泄漏,内存溢出,OOM,GC回收这几个概念。把App的堆内存空...

  • 记一次面试

    内存泄漏和内存溢出 概念 内存泄漏:垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。 内存溢出:...

  • android中内存泄漏

    内存泄漏和内存溢出的关系 内存泄漏: 是指申请空间后,在使用完后没有释放。 内存溢出: 程序向系统申请的内存超过了...

网友评论

      本文标题:内存泄漏&内存溢出

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