Java内存泄漏&内存溢出

1.定义

OOM内存溢出是指应用程序尝试使用更多内存资源,而系统无足够的内存,导致程序崩溃。

内存泄漏是指应用程序中分配的内存未能被正确释放,导致系统中的可用内存逐渐减少。

2.内存泄漏的原因

可能包括对象引用未被释放、缓存未被清理等。

以下三种常见情况及其解决措施一一列出:

2.1Thread

当线程持有对某些对象的引用,但这些对象却无法被释放,从而导致内存泄漏。

2.2Handler

由于Handler持有对Activity或Fragment的引用,

当这些Activity或Fragment被销毁时,Handler仍然持有对它们的引用。

2.3Bitmap

1、由于未及时回收Bitmap

2、或者Bitmap持有某些对象的引用未释放

3、频繁创建Bitmap对象

3.解决措施

3.1Thread

确保在不需要时,停止线程并释放对象引用

3.2Handler

使用静态内部类来持有Handler

或者在Activity或Fragment销毁时及时移除Handler

3.3Bitmap

1、使用完Bitmap及时recycle()

2、及时释放不需要的Bitmap对象

3、考虑使用对象池来重复利用Bitmap对象

4、使用SoftReference或WeakReference来持有该对象,内存不足系统自动回收

4.举个例子说明

问题

在MVP架构中,内存泄漏可能发生在Presenter层持有对View层的引用时。

如果Presenter持有对Activity或Fragment的引用,并且Activity或Fragment在被销毁时Presenter没有被正确释放,Presenter将继续存在于内存中,导致Activity无法被正确回收。

办法

1、在Activity或Fragment的生命周期方法(如onDestroy)中及时释放Presenter对象的引用

2、使用弱引用(WeakReference)来持有Presenter对象,以便在Activity或Fragment销毁时能够被正确回收。

相关推荐
旖旎夜光2 分钟前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
SL_staff8 分钟前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
揽星河..20 分钟前
【C语言】结构体
c语言·开发语言
2601_9669496536 分钟前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Mikko739 分钟前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.1 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff1 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
神仙别闹2 小时前
基于Python实现英词语自动对齐系统
开发语言·python
akinggw2 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
代码山河2 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目