一、图片转bitmap导致内存泄漏
https://mp.youkuaiyun.com/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中,非静态内部类和匿名内部类会持有外部类的隐式引用,而静态内部类不会
参考例子: