0
点赞
收藏
分享

微信扫一扫

Android性能优化-内存泄漏

90哦吼 2021-09-30 阅读 108
性能优化

一、什么是内存泄漏?

注意:内存释放主要考虑new出来的这部分对象,这部分对象在堆里面,才会被GC回收。因此内存泄漏主要考虑new出来的对象不用了能不能及时回收掉。

二、出现内存泄漏的原因?

三、常见的内存泄漏有哪些?

1.Context被静态持有

calss Util{
   private static Context context;
   public static void utils(Context context){
       this.context = context;
   }
}

2.非静态内部类

class Activity{
    r = new Runnable(){
        run(){//耗时操作}
    }
    t = new Thread(){}
}

解决方法:

class Activity{
    MyRunnable r = new MyRunnable()
    void create()
    private static class MyThread extends Thread {
    }
    private static class MyRunnable implements Runnable{
    }
}

3.静态集合存储对象

Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
    Object o = new Object();
    v.add(o);
    o = null;
}

4.资源未关闭 没有解除注册造成内存泄露

5.Handler引起的内存泄漏

四、Handler引起的内存泄漏分析

1.之前我们定义的Handler

// 接收消息,定义一个Handler对象,并实现handleMessage方法
Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        // 在此接收子线程发送的消息
    }
};

//发送消息
 Message msg=new Message();
 msg.obj=receiveData;
 msg.what= MSG_RECEIVEDATA_SUCCEED;
 handler.sendMessage(msg);

2.为什么现在这样定义会引起内存泄漏?

public class HandlerActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
        //发送一条10分钟后的消息
        handler.sendEmptyMessageDelayed(0, 10 * 60 * 1000);
        //然后关闭Activity
        finish();
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // ...
        }
    };
}

3.怎么解决内存泄漏?

即在内部类的构造方法中,创建一个对外部类的弱引用,然后再内部类的方法中通过弱引用获取外部类对象,进行非空判断后再进行操作,OK,修改一下我们的代码

public class HandlerActivity extends BaseActivity {

    @Bind(R.id.tv_handler)
    TextView tvHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
        ButterKnife.bind(this);

        new WeakHandler(this).sendEmptyMessageDelayed(0, 10 * 60 * 1000);
        finish();
    }

    private static class WeakHandler extends Handler {

        WeakReference<HandlerActivity> weakReference;

        public WeakHandler(HandlerActivity activity) {
            weakReference = new WeakReference<HandlerActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            HandlerActivity activity = weakReference.get();
            if (activity != null && activity.tvHandler != null) {
                activity.tvHandler.setText("收到Handler发送的消息");
            }
        }
    }
}

4.最终目的

五、四种引用

六、内存泄漏分析工具

  • 哪怕完全了解 内存泄露的原因,但难免还是会出现内存泄露的现象
  • 下面将简单介绍几个主流的分析内存泄露的工具,分别是
    1. MAT(Memory Analysis Tools)
    2. Heap Viewer
    3. Allocation Tracker
    4. Android Studio 的 Memory Monitor
    5. LeakCanary

6.1 MAT(Memory Analysis Tools)

  • 定义:一个EclipseJava Heap 内存分析工具 ->>下载地址
  • 作用:查看当前内存占用情况

6.2 Heap Viewer

  • 定义:一个的 Java Heap 内存分析工具
  • 作用:查看当前内存快照

6.3 Allocation Tracker

6.4 Memory Monitor

  • 简介:一个 Android Studio 自带 的图形化检测内存工具

  • 作用:跟踪系统 / 应用的内存使用情况。

6.5 LeakCanary

举报

相关推荐

0 条评论