关注
一、什么是OOM
OOM(out of memory)即内存泄露。一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当该对象占用的内存无法被回收时,就容易造成内存泄露。
二、出现内存泄露原因
1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM。资源性对象比如:
1-1,Cursor
1-2,调用registerReceiver后未调用unregisterReceiver()
1-3,未关闭InputStream/OutputStream
1-4,Bitmap使用后未调用recycle()
2.作用域不一样,导致对象不能被垃圾回收器回收,比如:
2-1,非静态内部类会隐式地持有外部类的引用,
2-2,Context泄露
概括一下,避免Context相关的内存泄露,记住以下事情:
1、 不要保留对Context-Activity长时间的引用(对Activity的引用的时候,必须确保拥有和Activity一样的生命周期)
2、尝试使用Context-Application来替代Context-Activity 3、如果你不想控制内部类的生命周期,应避免在Activity中使用非静态的内部类,而应该使用静态的内部类,并在其中创建一个对Activity的弱引用。
这种情况的解决办法是使用一个静态的内部类,其中拥有对外部类的WeakReference。
2-3,Thread 引用其他对象也容易出现对象泄露。
2-4,onReceive方法里执行了太多的操作
3.内存压力过大
3-1,图片资源加载过多,超过内存使用空间,例如Bitmap 的使用
3-2,重复创建view,listview应该使用convertview和viewholder
三、如何避免内存泄露
1.使用缓存技术,比如LruCache、DiskLruCache、对象重复并且频繁调用可以考虑对象池
2.对于引用生命周期不一样的对象,可以用软引用或弱引用SoftReferner WeakReferner
3.对于资源对象 使用finally 强制关闭
4.内存压力过大就要统一的管理内存
查看原帖
点赞 评论
相关推荐
2025-11-19 17:27
门头沟学院 嵌入式软件开发 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 为了入行xx岗,我学了__ #
7342次浏览 115人参与
# 26届校招投递进展 #
586400次浏览 3775人参与
# 简历第一个项目做什么 #
8425次浏览 124人参与
# 被说“做题家”,你的反应是_____? #
3120次浏览 106人参与
# 实习的你做了哪些离谱的工作 #
11402次浏览 126人参与
# 你都见过什么样的草台班子? #
10542次浏览 83人参与
# Prompt分享 #
3442次浏览 93人参与
# 找实习记录 #
40652次浏览 592人参与
# 工作压力大,你会干什么? #
15332次浏览 336人参与
# 从哪些方向判断这个offer值不值得去? #
48734次浏览 342人参与
# 找工作前vs找工作后的心路变化 #
37308次浏览 301人参与
# AI让你的思考变深了还是变浅了? #
5915次浏览 147人参与
# 多益网络求职进展汇总 #
62263次浏览 281人参与
# 如果不上班,你会去做什么 #
8445次浏览 297人参与
# 入职以后才知道的校招谎言 #
117264次浏览 747人参与
# 去年你投递实习了吗? #
28222次浏览 335人参与
# 大家每天通勤多久? #
75477次浏览 537人参与
# 今年秋招还有金九银十吗 #
71455次浏览 502人参与
# 邪修省钱套路 #
8553次浏览 268人参与
# 校招入职后的感受 #
466617次浏览 3629人参与


