android中单例模式为什么会引起内存泄漏?

单例模式使用不恰当会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 如果一个对象已经不需要使用了,但是单例对象还持有该对象的引用,那么这个对象就不能被正常回收,因此会导致内存泄漏。

举个例子:

①新建一个工程。

②配置好LeakCanary检测环境。

③添加一个单例类AppManager

④在MainActivity中使用此单例

运行代码后做如下操作:

①点击返回键,退出MainActivity。

②等待10秒。

做完如上操作后,LeakCanary提示MainActivity内存泄漏:

现在来分析一下内存泄漏的原因:

AppManager appManager = AppManager.getInstance(this);这句传入的是Activity的Context,由于Activty是间接继承自Context的。当这个Activity退出时Activity应该被回收, 但是单例中又持有它的引用,导致Activity回收失败,造成内存泄漏。

为了防止误传Activity的Context , 可以修改一下单例的代码:

这样不管外面传入什么Context,最终都会使用Applicaton的Context,而单例的生命周期和应用的一样长,这样就防止了内存泄漏。

修改完毕后,运行代码,重复以上操作,将会发现leakCanary没有检测出泄漏。

相关推荐
亘元有量-流量变现2 分钟前
ASO优化全流程实操指南:从基础到迭代,精准提升App曝光与转化
android·ios·harmonyos·aso优化·方糖试玩
yaoxin5211239 分钟前
376. Java IO API - 使用 Globbing 和自定义 Filter 过滤目录内容
java·开发语言·python
手握风云-11 分钟前
JavaEE 初阶第三十一期:JVM,一次Full GC的架构级思考(下)
java·java-ee
Mr YiRan12 分钟前
JNI技术之手写JNIEnv与静态缓存与native异常
java·c++
lifallen17 分钟前
Flink Agents:Python 执行链路与跨语言 Actor (PyFlink Agent)
java·大数据·人工智能·python·语言模型·flink
常利兵18 分钟前
Spring Boot配置diff:解锁配置管理新姿势
java·spring boot·后端
小臭希22 分钟前
Git(代码版本控制系统)
java·git·github
北风toto25 分钟前
java进制转换方法
java·开发语言·python
私人珍藏库28 分钟前
【Android】GameNative 0.9.0 [特殊字符] 手机畅玩Steam游戏
android·游戏·智能手机·app·工具·软件·多功能
2301_7926748629 分钟前
java学习day27(算法)
java·学习·算法