关于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内 ...
随机推荐
- asp.net mvc 的几种分页Pager
第一种 /// <summary> /// 分页Pager显示 /// </summary> /// <param name="html">&l ...
- php-fpm配置文件详解
第一部分:FPM 配置 参数 | 说明 -p | 命令行中动态修改--prefix ;include=etc/fpm.d/*.conf | 用于包含一个或多个文件,如果glob(3)存在(glob() ...
- JMS - 消息选择器
消息选择器 将消息选择器应用在消费者,消费者就只会接受能通过过滤器的消息.消息选择器是基于 SQL-92 条件表达式语法的一个子集.消息选择器由三个元素组成:标识符.常量和标记运算符. 标识符 标识符 ...
- HDOJ2018母牛的故事
母牛的故事 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- response小结(三)—输出随机图片(验证码功能实现)
本文是一个很简单的向网页上输出验证码的实现喲!通过注释解释清楚了每一步! Myeclipse下的Package Explorer显示文件结构如下: ResponseDemo.java实现了输出随机图片 ...
- 通过读取配置文件App.config来获取数据库连接字符串
有两种方式://通过读取配置文件来获取连接字符串 第一种方式: App.config 文件的格式: <?xml version="1.0" encoding="ut ...
- C#_简单Excel导入
引用程序集 Microsoft.Office.Core Microsoft.Office.Interop.Excel using System; using System.Collections.Ge ...
- C# to Maxscript
I figured I’d do a quick tutorial about something a little more difficult, but still very important. ...
- (转)实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient
1. 构造函数 public MemcachedClient(InetSocketAddress[] ia) throws IOException; public MemcachedClient(Li ...
- Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)G爬楼梯
题目描述 由于第m个台阶上有好吃的薯条,所以薯片现在要爬一段m阶的楼梯. 薯片每步最多能爬k个阶梯,但是每到了第i个台阶,薯片身上的糖果都会掉落ai个,现在问你薯片至少得掉多少糖果才能得到薯条? 输入 ...