关于android内存泄漏的研究
博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙;二是也因为自己没有写博客的习惯了。现在还算是比较稳定了,加上这个迭代基本也快结束了,有点时间来写写博客。好了,废话少说,下面进入正题,关于android内存泄漏的研究:
最近参与公司项目的迭代,发现这个几百万用户量的项目经过这么多的迭代了,还是一直存在严重的内存泄漏的问题,这个其实刚入职的时候就发现了,但是一直没敢说。现在也算是老员工了,这个迭代我提了出来,正好我的迭代开发工作也基本完成了,于是就是我去查这个问题,开始做的时候我才发现,给自己出了个难题,七,八万行的代码,很多的模块,很多的代码我都没接触过。没办法,只能硬着头皮来了。
android内存泄漏,其实泄漏几个String,泄漏几个普通对象,对用户体验没什么影响,主要问题在于泄漏了跟界面有关的东西,如View,Activity,PopupWidow,和Dialog,和Bitmap。泄漏,不只是说反复进入内存是不是一直增大,而且当你的这些界面关闭时,它所占用的空间会不会被释放掉。我们的项目有100多个PopupWindow,Dialog,和自定义View,十几个Activity,显然先查Activity是明智的,而且Activity的严重程度也比较高,于是找了个最简单的Activity开始查。
像数据库游标用完关闭,以及文件读取关闭,和全局Bitmap用完释放,这类的这里就不详细说了。
①像这些界面类,释放不掉,原因肯定是它自己的实例被传来传去,最后传到一个静态全局变量中,导致其一直释放不了(因为静态变量一直不释放)。或者是界面类的全局变量有引用到它自己,然这个变量可能又被其他的静态变量中,一直被引用着,没有释放掉。
建议:在要用到Context的时候,尽量传Application而不是Activity实例(有一些情况没办法,用完要做好手动释放)。
在这些界面类中,如果用到了静态变量引用到这些界面类本身,界面关闭的时候要手动释放掉。
如果是加入了ArrayList等集合中,那么界面退出时,要把它从集合中移除。(这个问题大了,不只是退出没有释放的问题,而是每一次操作都会使你的程序的内存增大,很快就会内存溢出)
②关于WebView使用,内存泄漏的问题。
WebView会占很大的空间,而且用普通的在xml布局中写WebView的方法,WebView并不会释放(查了资料,发现是android的bug),于是我们要动态加载它,可以把它放到一个ViewGroup中,在布局中加一个ViewGroup(RelativeLayout,FrameLayout都可以,其他的每测)在代码中new WebView(这里要传application,不要传Activity),然后把webview加入到ViewGroup中就可以。但是在界面关闭的时候记得释放掉:
viewGroup.removeAllViews();
webview.destroy();
webview = null;
就可以使其释放掉了。
关于内存泄漏查找工具,用的Memory Analyzer Tool,可能是我不太会用,感觉只是对那种每一次执行操作内存都会增大的情况有用,它就只帮我解决了一个这种问题,情况是我在每一次切换账户时,内存都会增大一些,于是我就不断的切换,然后用Memory Analyzer Tool去查看,一眼就找到了那个特别大的类,然后看了下代码,发现一直在往一个List里面加东西,没有移除。
这是我在我们的项目中发现的内存泄漏的相关问题,基本上把内存问题解决了,不过还是有一些泄漏,有的地方是找不到,有的地方是改动太大,现在不能动。不过问题不大,把所有界面跑一遍,在G1上泄漏了0点几兆,不会引起内存溢出。第①个看似简单,其实是最难找的,尤其是在特别大的项目中,它们隐藏的会特别深,所以我们在写代码的时候一定要去考虑的内存泄漏的情况,不然以后再查找起来,要浪费掉好几倍的时间。
如果还有其他的内存泄漏的情况或者有什么好的建议,希望大家补充,共同探讨,共同进步。
关于android内存泄漏的研究的更多相关文章
- 【转】android 内存泄漏相关收藏博客。
关于android内存泄漏的研究 博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基 ...
- Android内存泄漏检测利器:LeakCanary
Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...
- Android内存泄漏的各种原因详解
转自:http://mobile.51cto.com/abased-406286.htm 1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我 ...
- Android 内存泄漏优化汇总
android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非 ...
- Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- [Android]Android内存泄漏你所要知道的一切(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 ...
- LeakCanary 来检查 Android 内存泄漏
LeakCanary 来检查 Android 内存泄漏
- Android内存泄漏的检测流程、捕捉以及分析
https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...
- Android内存泄漏原因
这段时间调试APP的时候,发现程序在加载了过多的bitmap后会崩溃.查看了日志,原来是发生了内存溢出(OOM).第一次遇到这样的问题,那就慢慢排查吧. 内存优化可以参考胡凯大神的博客Android内 ...
随机推荐
- 用Gradle 构建android程序
前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ...
- 多tab页框架的使用场合
多tab页框架适合应用于功能较少的场合,例如邮箱后台之类的. 对于一些业务功能多且复杂的场合就不适用.打开过多的tab页容易给用户造成混乱,页面的跳转也存在一定的难度. 一种新技术不能完全取代旧技术, ...
- Angular 2.0 从0到1 (四)
第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2.0 从0到1 (四)第五节: ...
- Bootstrap ACE后台管理界面模板-jquery已整理
做后台通用模板,基于bootstrap,jquery写成的模板,非常齐全.国内不能正常访问google我将不能访问的jquery替换成cdn.bootcss.com网站下的jquery 链接: htt ...
- 【WebKit】---WebKit的CSS扩展(WebKit是私有属性)
1.-webkit-touch-callout 当你触摸并按住触摸目标时候,禁止或显示系统默认菜单.在iOS上,当你触摸并按住触摸的目标,比如一个链接,Safari浏览器将显示链接有关的系统默认菜单. ...
- HDOJ2008数值统计
数值统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- GitHub 基本操作流程
GitHub是最先进的分布式版本控制工具,下面是我学习中总结的操作流程,仅供参考 ----------------------------------------------------------- ...
- 高性能CSS(一)
避免使用@import 有两种方式加载样式文件,一种是link元素,另一种是CSS 2.1加入@import.而在外部的CSS文件中使用@import会使得页面在加载时增加额外的延迟.虽然规则允许在样 ...
- Android - 代码片段
转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/android-code-snippets/ 说明 此篇文章为个人日常使用所整理的一此代码片段,此篇文正将会不 ...
- 《Spring3.0就这么简单》
第一章 认识Spring 1.Spring提供的IOC容器,是Spring大杀器之一.容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创 ...