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设置退出逻辑条件的习惯

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zz白龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值