Sogrey / Android_QA

https://sogrey.github.io/Android_QA/
MIT License
0 stars 0 forks source link

造成内存泄露原因有什么? #146

Open Sogrey opened 5 years ago

Sogrey commented 5 years ago
Sogrey commented 5 years ago

111

Sogrey commented 4 years ago

什么时候会发生内存泄露?内存泄露的根本原因:长生命周期的对象持有短生命周期的对象。短周期对象就无法及时释放。

1. 静态集合类引起内存泄露

主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。

2. remove 方法无法删除set集 Objects.hash(firstName, lastName);

经过测试,hashcode修改后,就没有办法remove了。

3. observer 我们在使用监听器的时候,往往是addxxxlistener,但是当我们不需要的时候,忘记removexxxlistener,就容易内存leak。

广播没有unregisterrecevier

4. 各种数据链接没有关闭,数据库contentprovider,io,sokect等。cursor

5. 内部类:

java中的内部类(匿名内部类),会持有宿主类的强引用this。

所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。

Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。

6. 单例

单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存leak。