一、常见的内存泄漏
对于较大规模的Android应用开发,内存泄漏是个让人十分头痛的问题。一般来说,Android使用Java语言进行开发,通过GC进行内存回收。如果对象处于被引用的状态,那么GC是无法回收的。尤其是Android中Activity的Context,很容易在不易察觉的情况下被引用。Activity关闭的时候,引用该Context的对象还在使用中,致使Activity无法回收造成泄漏。而Context中有大量该Activity相关的信息以及资源,通常内存泄漏较大。
二、查看Activity是否有内存泄漏
Andorid在Eclipse中的DDMS插件比较适合用于查找内存泄漏问题。具体方法Google的SDK文档中都有介绍,简单说来就是:在DDMS中选择需要查看的进程,点击Update(绿色小桶),标签选择到Heap,点击Cause GC就能看到当前内存使用状况。注意观察data object一项,手机上不断打开关闭要测试的Activity,看该项是否不断上涨,如果不断上涨且Cause GC无法回到原来大小,则很可能是内存泄漏。
三、定位内存泄漏
Android中定位内存泄漏据我所知没有什么好的方法(如果有人知道请一定告诉我)。常用的方式是将部分代码注释掉一半,再查看DDMS内存状况,通过不断的二分法进行定位。
四、内存泄漏问题总结
(1)Android中OrientationEventListener,Enable之后,在onDestroy的时候必须Disable,否则泄漏。
(2)内存泄漏:多线程
在非UI线程(Worker Thread)中有时会用到this.wait()方法让线程进入等待状态。此时,如果Activity退出没有干涉它,那么该线程将一直处于等待状态,线程持有的对象将无法回收。所以,在Activity退出时,要notify等待的worker线程。如果线程中有长时间循环的话,要通过标志位等方法将循环结束。
对于较大规模的Android应用开发,内存泄漏是个让人十分头痛的问题。一般来说,Android使用Java语言进行开发,通过GC进行内存回收。如果对象处于被引用的状态,那么GC是无法回收的。尤其是Android中Activity的Context,很容易在不易察觉的情况下被引用。Activity关闭的时候,引用该Context的对象还在使用中,致使Activity无法回收造成泄漏。而Context中有大量该Activity相关的信息以及资源,通常内存泄漏较大。
二、查看Activity是否有内存泄漏
Andorid在Eclipse中的DDMS插件比较适合用于查找内存泄漏问题。具体方法Google的SDK文档中都有介绍,简单说来就是:在DDMS中选择需要查看的进程,点击Update(绿色小桶),标签选择到Heap,点击Cause GC就能看到当前内存使用状况。注意观察data object一项,手机上不断打开关闭要测试的Activity,看该项是否不断上涨,如果不断上涨且Cause GC无法回到原来大小,则很可能是内存泄漏。
三、定位内存泄漏
Android中定位内存泄漏据我所知没有什么好的方法(如果有人知道请一定告诉我)。常用的方式是将部分代码注释掉一半,再查看DDMS内存状况,通过不断的二分法进行定位。
四、内存泄漏问题总结
(1)Android中OrientationEventListener,Enable之后,在onDestroy的时候必须Disable,否则泄漏。
(2)内存泄漏:多线程
在非UI线程(Worker Thread)中有时会用到this.wait()方法让线程进入等待状态。此时,如果Activity退出没有干涉它,那么该线程将一直处于等待状态,线程持有的对象将无法回收。所以,在Activity退出时,要notify等待的worker线程。如果线程中有长时间循环的话,要通过标志位等方法将循环结束。