什么是内存泄漏
在Java中,内存泄漏的对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用系统内存。
下面给出了一个简单的内存泄露的例子。循环申请Object对象,并将所申请的对象放入Vector中,如果仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。
Android中常见内存泄露
单例模式的内存泄漏
修改后的代码
Handler引起的内存泄漏
解决方案
多线程引起的内存泄漏
修改后的代码
集合类内存泄漏
解决方法
Webview的内存泄漏
WebView在加载网页后会长期占用内存而不能被释放,因此在Activity销毁后要调用它的destory()方法来销毁它以释放内存
另一解决的方案就是给webview一个单独的进程,当webview所在的activity销毁时,直接杀掉这个单独开启的进程,此方案的注意点:1.app内进程间通信需要通过广播和aidl交互,2.数据持久化需要通过ContentProvider进行处理
常用内存泄漏检测工具
可以使用自带的MAT性能分析工具,也可以使用LeakCanary。这个工具是在Github开源的,是Square公司出品的,其使用简单方便。
其实无论是AndroidStudio中自带的MAT内存分析工具,还是LeakCanary,原理都是一样的,都是dump java heap出来进行分析,找到泄漏的问题,只是LeakCanary已经帮我们把分析的工作做好了
网友评论