博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙;二是也因为自己没有写博客的习惯了。现在还算是比较稳定了,加上这个迭代基本也快结束了,有点时间来写写博客。好了,废话少说,下面进入正题,关于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内存泄漏的研究的更多相关文章

  1. 【转】android 内存泄漏相关收藏博客。

    关于android内存泄漏的研究   博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基 ...

  2. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  3. Android内存泄漏的各种原因详解

    转自:http://mobile.51cto.com/abased-406286.htm 1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我 ...

  4. Android 内存泄漏优化汇总

    android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非 ...

  5. Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  6. [Android]Android内存泄漏你所要知道的一切(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 ...

  7. LeakCanary 来检查 Android 内存泄漏

    LeakCanary 来检查 Android 内存泄漏

  8. Android内存泄漏的检测流程、捕捉以及分析

    https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...

  9. Android内存泄漏原因

    这段时间调试APP的时候,发现程序在加载了过多的bitmap后会崩溃.查看了日志,原来是发生了内存溢出(OOM).第一次遇到这样的问题,那就慢慢排查吧. 内存优化可以参考胡凯大神的博客Android内 ...

随机推荐

  1. nineOldAnimation 应用

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  2. Servlet & JSP - Servlet API Overview

    Servlet & Generic & HttpServlet 类图 Servlet 的生命周期 init.service 和 destroy 是 servlet 的生命周期方法,它们 ...

  3. Ehcache(2.9.x) - API Developer Guide, Searching a Cache

    About Searching The Search API allows you to execute arbitrarily complex queries against caches. The ...

  4. dreamweaver中用正则表达式查找替换批量删除 tppabs标签的方法

    查找替换 正则表达式  \btppabs="h[^"]*" 后面不能有空格 你懂得的 选中右下角的 √[使用正则表达式] 替换全部

  5. Android之进度条1

    第一种方法(比较简单): package com.example.dialogdemo; import java.util.Random; import android.app.Activity; i ...

  6. ListView onItemClick(AdapterView<?> parent, View view, int position, long id)参数详解

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { parent.getA ...

  7. .net chart(图表)控件的使用-System.Windows.Forms.DataVisualization.dll

    这个案例指在介绍微软这套免费又功能强大的图表控件Microsoft Chart Controls for Microsoft .NET Framework 3.5,通过它,可让您的项目及报表,轻松套用 ...

  8. Android系统中提供的原子操作

    代码的实现位于文件system/core/include/cutils中 http://androidxref.com/4.4.3_r1.1/xref/system/core/include/cuti ...

  9. C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想

    如果你接触过<设计模式>.软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”. 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例). OOP的 ...

  10. iOS开发 中的代理实现

    iOS开发 中的代理实现 关于今天为什么要发这篇文字的原因:今天在和同事聊天的时候他跟我说项目中给他的block有时候不太能看的懂,让我尽量用代理写,好吧心累了,那就先从写个代理demo,防止以后他看 ...