Android内存泄漏情况总结

1.内存泄漏的概念:

通俗点讲:

生命周期长的对象持有生命周期短的对象的引用,导致GC无法回收短生命周期对象。

系统来说:

jvm通过可达性算法,没有用的对象资源与GC-Root保持可达路径,导致系统无法进行回收

2.可以作为GC-Root的对象:

1.局部变量所引用的对象
2.方法参数所引用的对象
从虚拟机角度来看:
1.java虚拟机栈所引用的对象
2.方法区中的类静态属性引用的对象。 (一般指被static修饰的对象,加载类的时候就加载到内存中。)
比如单例模式
3.方法区中的常量引用的对象。
4.本地方法栈中的JNI(native方法)引用的对象

1.常见类型的内存泄漏

1.非静态内部类持有外部类的引用,如非静态handler持有activity的引用
2.接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus
3.Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
4.单例中的static成员间接或直接持有了activity的引用
5.资源对象没关闭造成的内存泄漏(如: Cursor、File等)
6.全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合)

2.Android Api使用导致的内存泄漏

Timer ,TimerTask,Handler等

Thread是如何造成内存泄露的,如何解决?
垃圾回收器不会回收GC Roots以及那些被它们间接引用的对象
非静态内部类会持有外部类的引用。Thread 会长久地持有 Activity 的引用,使得系统无法回收 Activity 和它所关联
的资源和视图。
使用静态内部类,不要使用非静态内部类
该养成为thread设置退出逻辑条件的习惯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz白龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值