Android 关于内存泄漏的一些总结
(做Android开发一年多后,第一次发文章,还都是拷过来的,主要是方便下次看)
避免Context相关的内存泄露的两种方法
- 最明显的方法是避免在Context的作用域之外使用它。
- 第二种方法就是使用
Application Context
。这个Context会一直存活只要你的应用是活着的,并且不依赖于Activity的生命周期。如果你打算维持一个长时间存在的并且需要Context的对象时,记住使用应用的Context。获取方法:Context.getApplicationContext()或Activity.getApplication()
同时,为了避免Context相关的内存泄露,记住下面几点:
- 不要维持一个长时间存在对Activity的Context的引用(Activity的引用和Activity有着一样的生命周期)
- 使用Application的Context而不是Activity的Context
- 避免在Activity中使用非静态内部类,如果你不想控制他们的生命周期。使用静态内部类,并在它的内部创建一个对Activity的弱引用
1、对于生命周期比Activity长的对象如果需要应该使用ApplicationContext
2、在涉及到Context时先考虑ApplicationContext,当然它并不是万能的,对于有些地方则必须使用Activity的Context
3、对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏
4、对于生命周期比Activity长的内部类对象,并且内部类中使用了外部类的成员变量,可以这样做避免内存泄漏:
将内部类改为静态内部类 静态内部类中使用弱引用来引用外部类的成员变量
5、对于不再需要使用的对象,显示的将其赋值为null,比如使用完Bitmap后先调用recycle(),再赋为null
6、保持对对象生命周期的敏感,特别注意单例、静态对象、全局性
集合等的生命周期
参考:http://blog.csdn.net/sinat_22949049/article/details/51925411
使用新版Android Studio检测内存泄露和性能
内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴。
怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的Android Studio 检测内存非常方便, 如果结合上MAT工具,LeakCanary插件,一切就变得so easy了。
熟悉Android Studio界面
工欲善其事,必先利其器。我们接下来先来熟悉下Android Studio的界面
首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中。
通过Android Studio自带的界面,查看内存泄露还不是很智能,我们可以借助第三方工具,常见的工具就是MAT了,下载地址 http://eclipse.org/mat/downloads.php ,这里我们需要下载独立版的MAT. 下图是MAT一开始打开的界面, 这里需要提醒大家的是,MAT并不会准确地告诉我们哪里发生了内存泄漏,而是会提供一大堆的数据和线索,我们需要自己去分析这些数据来去判断到底是不是真的发生了内存泄漏。
LeakCanary
1
2
3
4
|
<code class = " hljs matlab" >dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}</code>
|
在应用的Application onCreate方法中添加LeakCanary.install(this),如下
1
2
3
4
5
6
7
|
<code class = " hljs java" > public class ExampleApplication extends Application
@Override
public void onCreate() {
super .onCreate();
LeakCanary.install( this );
}
}</code>
|
追踪内存分配
查询方法执行的时间
我们如何判断可能有问题的方法?
通过方法的调用次数和独占时间来查看,通常判断方法是:
如果方法调用次数不多,但每次调用却需要花费很长的时间的函数,可能会有问题。 如果自身占用时间不长,但调用却非常频繁的函数也可能会有问题。
综述
上面给大家介绍了若干使用Android Studio检查程序性能的工具,工具永远是辅助,不要因为工具耽误太长时间。如果有问题,欢迎大家纠正。
参见:http://www.2cto.com/kf/201512/455421.html
Android 关于内存泄漏的一些总结相关推荐
- android分析内存工具,Android Studio内存泄漏分析工具汇总
Android Studio内存泄漏分析工具汇总 时间:2017-04-25 来源:Android开发学习网 在Android开发过程中,让人头疼的就是内存泄露问题了,很小的一个错误都会引起内 ...
- Android 中内存泄漏的原因和解决方案
之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...
- Android Native内存泄漏诊断
Android Native内存泄漏诊断 1.基础诊断方法 特点:操作简单,但只能判断是否有泄漏,但需使用者自行判断泄漏在哪里 命令行方式 adb shell dumpsys meminfo vStu ...
- Android之内存泄漏以及解决办法(持更)
Android之内存泄漏以及解决办法 文章链接:http://blog.csdn.net/qq_16628781/article/details/67761590 知识点: 单例造成的内存泄漏原因和解 ...
- android handler 销毁,Android Handler内存泄漏原因及解决方案
目录: 1.须知: 主线程Looper生命周期和Activity的生命周期一致. 非静态内部类,或者匿名内部类.默认持有外部类引用. 2.原因: Handler造成内存泄露的原因.非静态内部类,或者匿 ...
- Android 常见内存泄漏及解决方法
Android中的内存泄漏: 先说一下为什么会出现内存泄漏: Android程序开发中,如果一个对象已经不需要被使用了,本该被回收时,而这时另一个对象还在持有对该对象的引用,这样就会导致无法被GC回收 ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- android 内存检测框架,Android项目内存泄漏检测
关于Android项目的内存泄漏是一个老生常谈的问题,之前一直是在写代码时各种注意,比如IO流要及时关闭,引用的curcor要及时关闭等,这样做确实能规避一部分的内存泄漏,不过还是会有漏网之鱼,因此除 ...
- android runnable内存泄漏,这个Runnable可以防止内存泄漏吗?
我在Java中的总的初学者和已经创建了一个简单的Java的Android片断其中一个Runnable 1,5秒钟后,我改变TextView从Hello World到Hola Mundo.它工作正常,基 ...
- 来点干货 | Android 常见内存泄漏与优化(二)
作者 | 无名之辈FTER 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 在昨天的Android 内存泄漏问题多多,怎么优化?一文中,我们详细阐述了Java虚拟机工作原理和Androi ...
最新文章
- Netty入门官方例子
- Python的IDE之PyCharm:PyCharm的使用技巧图文教程(修改Pycharm默认风格颜色、编辑器内代码注释区域的颜色、编辑器内的Python Interpreter等)之详细攻略
- 工业工程专业C语言,工欲善其事必先利其器——工业工程课程设置及其核心专业课简介...
- C++ 接口(抽象类)
- java中53个关键字的意义及使用方法
- c语言中编译链接机制
- 全网首发:使用命令行编译VS工程为Win32/x64
- 计算机验证iq oq pq,验证、确认、鉴定过程、DQ、IQ、OQ、PQ这几个概念如何理解?...
- Mac下修改HD3000显存到1GB
- Unity 中的渲染优化技术
- Golang复杂json结构体解析
- 【总结】1334- JS中Object的keys是无序的吗
- coreapi自动生成API接口文档
- #今日论文推荐# 文字秒变3D?苹果发布最新AI生成模型GAUDI,根据文字提示创建3D场景
- Scala中Seq转Map的方法(:_*)
- Anbox之构建android.img(三)
- 急!!!微信公众号数据迁移后openid无法转换
- Word如何自动更新域
- 【QQ邮箱第三方客户端设置】Outlook登录QQ邮箱报错,解决方案。
- Beego2 使用Session时SetCookie无效