欢迎来到天天文库
浏览记录
ID:46548489
大小:76.50 KB
页数:9页
时间:2019-11-25
《Android应用程序如何避免内存泄漏以及如何检查泄漏原因》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Android应用程序如何避免内存泄漏以及如何检查泄漏原因Android的应用程序开发使用的Java语言。Java语言的GC机制使得在堆上分配内存之后无需再手动的释放内存,而是等待垃圾收集器来收集无用的对彖以凹收它们占用的内存。同时在Android的进程管理机制中每一个单独的应用程序在启动时都会创建一个新的Linux进程来运行该程序,应用程序在运行屮分配的内存也会在该应用程序退出时随着进程的销毁而释放,所以Android中的内存管理给开发人员造成的负担较轻。但应用程序还需耍在内存使用上注意不要使应用程序占用大量内存,原因有如下两点:1•应用程序占用的内存越少,Android可以同
2、时放入内存程序就越多,用户切换这些不同的程序所消耗的时间就越少,体验就越流畅。2.如果应用程序在消耗光了所有的可用堆空间(16M到48M),那么再试图在堆上分配新对象时就会引起OOM(OutOfMemoryError)异常,此时应用程序就会崩溃退出。所以在编写Android应用程序时,仍然需要对应用程序屮内存的分配和使用多加注意,特别是在存在后台线程、使用图片作为背景、在异步任务或者后台线程中需要Context±下文对象的情况下,要注意避免出现对Activity、View或drawable等类的对象长期持有无用的reference,否则就会造成被引用的对象无法在GC时回收,而是长
3、期占用堆空间,此时就发生了内存泄漏。持有Context引用造成的泄漏F面介绍一下Android开发文档中(AvoidingMemoryLeak)的一个内存泄漏的例子,该例子说明了Android应用程序中会引起内存泄漏的常见原因:长期保持了对Context对象的引用。在Android应用程序中,很多操作都用到了Context对象,但是大多数都是用來加载和访问资源的。这就是为什么所有的显示控件都需要一个Context对象作为构造方法的参数。在Android应用程序中通常可以使用两种Context对象:Activity和Application。当类或方法需要Context对象的时候常见
4、的作法是使用第一个作为Context参数。但这就意味着View对象对整个activity保持引用,因此也就保持对activity内的所有东西的引用,也就是整个View结构和它所有的资源都无法被及时的回收,而且对activity的长期引用是比较隐蔽的。@0verrideprotectedvoidonCreate(Bundlestate){super.onCreate(state);TextViewlabel=newTextView(this);labe1.setText("Leaksarebad");setContentView(label);当屏幕方向改变时‘Android系统默
5、认作法是会销毁当前的Activity,然后创建一个新的Activity,这个新的Activity会显示刚才的状态。在这样做的过程Android系统会重新加载UI用到的资源。现在假设的应用程序中有一个比较人的bitmap类型的图片,每次旋转时都重新加载图片所用的时间较多。为了提高屏幕旋转时Activity的创建速度,最简单的方法是用静态变量的方法。privatestaticDrawablesBackground;©OverrideprotcctcdvoidonCrcatc(Bundlestato){super.onCrcatc(statc);TextViewlabel=newTex
6、tView(this);labe1.setText(z,Leaksarebad");if(sBackground二二null){sBackground二getDrawable(R.drawable.large_bitmap);}"label.setBackgroundDrawable(sBackground);setContentVicw(labcl);这样的代码执行起来是快速的,但同时是错误的:这样写会一直保持着对Activity的引用。当一个Drawable对象附属于一个View时,这个View就相当于drawable对象的一个冋调(引用)。在上面的代码片段中,就意味着dra
7、wable和TextView存在着引用的关系,而TextView自己持有了对Activity(Context对象)的引用,这个Activity又引用了相当多的东西。有两种简单的方法可以避免由引用context对象造成的内存泄露。首先第一个方法是避免context对象超出它的作用范I韦I。上面的例子展示了静态引用的情况,但是在类的内部,隐式的引用外部的类同样的危险。第二种方法是,使用Application对象。这个context对象会随着应用程序的存在而存在,而不依赖于activi
此文档下载收益归作者所有