【你问我答】OOM发生的原因是哪些?该如何避免?

问题描述:

OOM发生的原因是哪些?该如何避免?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##Java工程师##面试题目#
全部评论
https://blog.csdn.net/mocas_wang/article/details/109604710博客,拉倒最下边,有答案
点赞 回复
分享
发布于 2020-12-08 23:19
一、什么是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.内存压力过大就要统一的管理内存
点赞 回复
分享
发布于 2020-12-09 19:54
滴滴
校招火热招聘中
官网直投
(1)什么是内存泄漏? 内存泄漏是指对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用。 举个例子:食堂吃完饭需要自己收盘,如果没有收盘,会有服务员帮忙收取,收取之后擦擦桌子,下一桌客人就可以来了(诶好像当时开心餐厅哈哈哈哈哈)。但是如果有客人吃完了,占着桌子看剧不走,那桌子就没法给下一个客人用了。如果今儿赶巧了,一帮人都来餐厅吃饭,占满了桌子,吃完了还都不走,这个餐厅不就没生意了吗?这就是内存泄漏的问题。 (2)如何解决内存泄漏? (2-1)使用临时变量的时候,让引用变量在退出活动域后自动设置为null,并减少静态变量的声明。相当于每个桌子上提前摆一个牌,写着“2小时内离场”,这样如果客人吃完饭赖在桌子上,我就有理由“送客”了。 (2-2)避免集中创建对象尤其是大对象,如果可以的话尽量使用流操作。相当于避免所有客人都同时到场同时点菜,这样会导致后面来的客人一看没位置全走了。反之,如果分批把客人迎进来,每个时间段就都会有客人离开腾出空桌子,也会有新客人进来。 (2-3)尽量运用对象池技术以提高系统性能,相当于把桌子变大一点 (2-4) 特别地,程序进行字符串处理时,尽量避免使用String,而应使用StringBuffer。
点赞 回复
分享
发布于 2020-12-14 21:34

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务