收集了一些关系Android性能优化方面你的文章:
- 枚举注解&枚举类的性能对比
- 主要介绍几个工具的使用
###内存泄露产生的原因:
-
静态集合类引起内存泄漏:
class A { // 静态集合引用了Object,可能造成泄露; static List<Object> list = new ArrayList<Object>(); void fun() { for (int i = 1; i<100; i++) { Object o = new Object(); v.add(o); o = null; } } }
-
监听器
调用addXXXListener()等方法来设置监听器,在释放对象的时候却没有记住去删除这些监听器,。 -
各种连接
- 数据库连接
- 网络连接(socket)
- io连接
-
内部类和外部模块的引用
非静态内部类持有对外部类的引用。public class SampleActivity extends Activity { // 1. 泄露的Handler,匿名内部类mLeakyHandler持有外部类SampleActivity的引用 private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Message msg) { // ... } } // -------------------------------------------------- // 2. 静态内部类SafeHandler private static class SafeHandler extends Handler { // 弱引用,一旦GC就回收 private final WeakReference<Activity> mActivity; public SafeHandler(Activity activity) { mActivity = new WeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { // 判断是否被回收 Activity activity = mActivity.get(); if (activity != null) { // do something... } } } }
-
单例模式
单例中传入了其他参数,导致该参数对象的生命周期和单例的生命周期相同,造成泄露。class A{ public A(){ B.getInstance().setA(this); } } //B类是单例 class B { private A a; //持有对A类的引用,造成A类的生命周期和B类相同; private static B instance=new B(); private B(){} public static B getInstance(){ return instance; } public void setA(A a) { this.a=a; } }