1、根据java的内存模型会出现内存溢出的内存有堆内存、方法区内存、虚拟机栈内存、native方法区内存;
2、一般说的OOM基本都是针对堆内存;
3、对于堆内存溢出主的根本原因有两种
(1)app进程内存达到上限
(2)手机可用内存不足,这种情况并不是我们app消耗了很多内存,而是整个手机内存不足
4、而我们需要解决的主要是app的内存达到上限
5、对于app内存达到上限只有两种情况
(1)申请内存的速度超出gc释放内存的速度
(2)内存出现泄漏,gc无法回收泄漏的内存,导致可用内存越来越少
6、对于申请内存速度超出gc释放内存的速度主要有2种情况
(1)往内存中加载超大文件
(2)循环创建大量对象
7、一般申请内存的速度超出gc释放内存基本不会出现,内存泄漏才是出现问题的关键所在
8、内存泄漏常见场景
(1)资源对象没关闭造成的内存泄漏(如: Cursor、File等)
(2)全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合)
(3)接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus
(4)Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
(5)单例中的static成员间接或直接持有了activity的引用
(6)非静态内部类持有父类的引用,如非静态handler持有activity的引用
9、怎么对内存进行优化呢
三个方向
(1)为应用申请更大内存,把manifest上的largdgeheap设置为true
(2)减少内存的使用
①使用优化后的集合对象,比如SpaseArray;
②使用微信的mmkv替代sharedpreference;
③对于经常打log的地方使用StringBuilder来组拼,替代String拼接
④统一带有缓存的基础库,特别是图片库,如果用了两套不一样的图片加载库就会出现2个图片各自维护一套图片缓存
⑤给ImageView设置合适尺寸的图片,列表页显示缩略图,查看大图显示原图
⑥优化业务架构设计,比如省市区数据分批加载,需要加载省就加载省,需要加载市就加载失去,避免一下子加载所有数据
(3)避免内存泄漏
编码规范上:
①资源对象用完一定要关闭,最好加finally
②静态集合对象用完要清理
③接收器、监听器使用时候注册和取消成对出现
④context使用注意生命周期,如果是静态类引用直接用ApplicationContext
⑤使用静态内部类
⑥结合业务场景,设置软引用,弱引用,确保对象可以在合适的时机回收
建设内存监控体系:
线下监控:
①使用ArtHook检测图片尺寸是否超出imageview自身宽高的2倍
②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏
线上监控:
①上报app使用期间待机内存、重点模块内存、OOM率
②上报整体及重点模块的GC次数,GC时间
③使用LeakCannery自动化内存泄漏分析
10、真的出现低内存,设置一个兜底策略
低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了系统Kill应用进程,与其让系统kill进程还不如浪费一些用户体验,自己主动回收内存

Android面试每日一题(4): 哪些情况下会导致oom问题?相关推荐

  1. 面试—每日一题(6)

    今天是第六期了!也总算到第六期了,不管搞什么,都贵在坚持!我还会坚持下去的,直到我找不到 面试来写为止!呵呵!我看,这下子够我喝一壶的了! 今天这篇博文没有前几期的那么有主题,就是今天的这篇博文比较杂 ...

  2. 面试—每日一题(8)

    好长时间没有更新博客了,特别是这个专栏,一是因为自己比较忙,二是因为我还是比较懒的缘故.让各位见笑了.今天在更新一篇. 像什么strcpy.strcat等等字符串的操作和实现在面试中经常出现,不管是上 ...

  3. 面试—每日一题(5)

    又是面试-每日一题,今天已经是这个系列的第5篇博文了!继续~~希望大家也能给力,给我顶起,也 好让我写的有信心啊! 好了,废话少说!开始今天的正题! #include <iostream> ...

  4. 面试—每日一题(1)

    大家好,现在本博文推出<面试-每日一题>专栏,专注于对面试题的讲解和解答.列举出各个公司的一些面试题,总结出其中的面试题得答题技巧,为以后的面试铺平道路.希望大家,有钱的捧个钱场,没钱的捧 ...

  5. 什么情况下会导致@Async异步方法会失效?

    什么情况下会导致@Async异步方法会失效? a.调用同一个类下注有@Async异步方法:在spring中像@Async和@Transactional.cache等注解本质使用的是动态代理,其实Spr ...

  6. 什么情况下会导致跨域

    什么情况下会导致跨域 协议 端口号 域名不相同就会发生跨域

  7. android activity启动流程_1307页!一线大厂Android面试全套真题解析!

    /   前言   / 金九银十到了,很多读者都反映有面试的需求,所以我特地给大家准备了一点资料! 下面的题目都是大家在面试一线互联网大厂时经常遇到的面试真题和答案解析,如果大家还有其他好的题目或者好的 ...

  8. Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex

    一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...

  9. Android面试送分题:微信小程序的事件处理,年薪50W

    目录 前言 Kotlin协程,现在已经成为了面试甚至是工作中一个非常火的东西. 本人在刚开始了解Kotlin协程的时候,断断续续看了网上不少文章,用长篇大论把Kotlin协程描述的非常玄乎,但是看完后 ...

最新文章

  1. 1390 游戏得分(贪心)
  2. Mybatis 学习系列文章
  3. flex布局:子子元素过大撑开了设定flex:1的子元素的解决方案
  4. hbase集群重启后异常删除zookeeper中的元数据
  5. intel服务器芯片组介绍,Intel芯片组的简介
  6. POJ 2942 Knights of the Round Table ★(点双连通分量+二分图判定)
  7. TCP/IP(三):IP协议相关技术
  8. C++ 工程实践(2):不要重载全局 ::operator new()
  9. struts2中action的class属性值意义
  10. python能做什么项目-用python真的可以做很多有趣的事!我自己做了些小项目!大家看看...
  11. 电驴搜索服务器正在连接,电驴连接不上服务器导致无法搜索解决的方法介绍
  12. c270 linux驱动下载,佳能 HD Webcam C270 驱动程序下载-更新佳能软件(网络摄像头)
  13. vue keyup不起作用
  14. 微信清除cookie
  15. ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯
  16. Linux命令全称(转)
  17. 基于51单片机的智能护眼台灯设计proteus仿真原理图PCB
  18. Android DRM框架与基础知识
  19. 基于Bmob云平台的android写日记带提醒功能
  20. <Linux>Ubuntu使用glade创建gtk UI应用程序

热门文章

  1. 宝藏又小众的线条免抠元素素材网站分享
  2. 数据库服务器显示网卡断开连接,数据库服务器故障分析与处理.doc
  3. 浅谈DNS域名解析过程
  4. smartctl工具输出解释
  5. web前端学习笔记——JQuery
  6. 微信抢红包的算法架构总结
  7. HD 2187 悼念512汶川大地震遇难同胞——老人是真饿了 【背包问题】
  8. Unity联网之使用Socket简单实现多人在线聊天室(一)
  9. 西子凌波回复集3(网友整理版)
  10. php局部刷新增删改查,局部刷新与模板 · Issue #18 · thx/magix-combine · GitHub