关注
一、什么是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-12-29 23:01
江西财经大学 外贸业务员 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
7044次浏览 104人参与
# 机械人避雷的岗位/公司 #
42024次浏览 280人参与
# 程序员找工作至少要刷多少题? #
13023次浏览 201人参与
# 12306一秒售罄,你抢到回家的票了吗? #
1170次浏览 39人参与
# 我现在比当时_,你想录用我吗 #
5822次浏览 89人参与
# 过年最难忘的一件事 #
23060次浏览 174人参与
# 你最满意的offer薪资是哪家公司? #
69505次浏览 349人参与
# 为了减少AI幻觉,你注入过哪些设定? #
2662次浏览 97人参与
# 牛客AI体验站 #
4826次浏览 148人参与
# AI Coding的使用心得 #
3500次浏览 91人参与
# 找工作的破防时刻 #
253156次浏览 1962人参与
# 刚入职的你踩过哪些坑 #
5367次浏览 113人参与
# 论秋招对个人心气的改变 #
7361次浏览 130人参与
# 一张图晒一下你的AI员工 #
3613次浏览 82人参与
# 关于春招/暑期实习,你想知道哪些信息? #
5398次浏览 98人参与
# 黄金这个事上,你学到了什么 #
1289次浏览 41人参与
# 机械人你知道哪些单休企业 #
85482次浏览 428人参与
# 程序员能干到多少岁? #
6813次浏览 104人参与
# 晒晒你司的新年福利 #
5568次浏览 89人参与
# 关于提前批我想问 #
267502次浏览 2307人参与

