Android内存泄露开篇

jopen 10年前

先来想这三个问题

  1. 内存泄露是怎么回事
  2. 内存会泄露的原因
  3. 避免内存泄露

1.内存泄露怎么回事

一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。  Android的一个应用程序的内存泄露对别的应用程序影响不大。  为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。  Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了  这个上限,则会被系统视为内存泄漏,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)

2.出现内存泄露原因

1.资源对象没关闭造成的内存泄露      资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存  2.变量的作用域不一样导致    变量                              作用域     函数变量                           函数内    成员变量                          整个对象内    TLS(ThreadLocalStorage)           整个线程    静态变量                          整个进场内    Binder(IPC)                      进程间     因为作用域的不同,作用域大引用到对象都可能不会马上销毁,所以会内存泄露。        handle 的内存泄露主要 TLS变量和 activity的生命周期不一样,。   Thread 引用其他对象也容易出现对象泄露。      3.内存压力过大    1.图片资源加载过多,超过内存使用空间,例如Bitmap 的使用    2.重复创建view,没有重复使用  listview,的使用

3.如何避免内存泄露

1.良好的代码规范,清晰代码逻辑  2.对于引用生命不一样的对象,可以用弱引用WeakReferner  3.对于资源对象 使用finally 强制关闭  4.内存压力过大就要统一的管理内存  5.对象重复并且频繁调用可以考虑对象池。

来自:http://blog.csdn.net/zhuanglonghai/article/details/37658661