内存泄漏OOM

一、图片转bitmap导致内存泄漏

https://mp.csdn.net/console/editor/html/105112308

二、全局进程的static变量是贯穿这个应用的生命周期

1、静态的Activity变量,生命周期结束后没有清空,所以泄漏的Activity一直存在应用进程中,不会被垃圾回收器回收;

2、static view引用

3、Activity持有内部类,并且对静态变量引用,内部类持有对外部类的强应用;-内存泄漏;

4、匿名类维护外部类引用;

5、Handler

private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case 1:
                    /**
                     * 非静态内部类会隐式地持有外部类的引用(MainActivity中TextView),这会导致外部类对象无法被系统的GC回收;
                     * 解决:
                     * 1、静态内部类持有外部类引用
                     * 2、弱引用的方式来持有外部类引用
                     */
                    System.out.println("----->" + msg);
                    textView.setText(msg.toString());
                    break;
            }
            return false;
        }
    });
....

 new Thread(new Runnable() {
            @Override
            public void run() {
                Message message = Message.obtain();
                message.what = 1;
                message.obj = "线程发送消息----";
                //长时间持有Handler引用,handleMessage
//                mHandler.sendMessage(message);
                mHandler.sendMessageDelayed(message,10000);
            }
        }).start();

如果这时候,用户按了返回键,撤销了这个Activity,就会可能导致内存泄漏,因为mHandler持有了Activity的引用,而Message又持有了Handler的引用,这个Message在MessageQueue中队列,直到时间到了才会被handleMessage。而在这段时间内,Activity是无法被GC回收掉的。
 

6、只要是匿名类的实例,不管是不是在工作线程,都会持有Activity的引用,导致内存泄漏

7、Sensor Manager

在Java中,非静态内部类和匿名内部类会持有外部类的隐式引用,而静态内部类不会

 

参考例子:

https://www.jianshu.com/p/ac00e370f83d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值