面试记录第十四节——(什么是oom)
2017-10-12 15:32
274 查看
一、什么是oom
答:当前占用的内存加上我们申请的内存资源超过了虚拟机的最大内存限制就会抛出Out of memroy异常(大部分的oom都是加载大图片引起的)
二、一些容易混淆的概念
答:内存溢出、内存抖动、内存泄露
内存溢出:就是我内存oom(Out of memroy),当前占有的内存加上我们申请的内存超过了虚拟机最大的内存限制就会抛出oom内存抖动:是短时间内大量的对象被创建会被马上释放,瞬间创建的对象会严重占用内存区。当达到最大值的时候就会触发GC,就会出现,你刚刚创建的对象就会被马上回收。就算每一次创建对象占用很少的内存,但是很多对象叠加在一起就会造成堆内存的压力,从而触发更多的GC。
内存泄露:进程中的默写对象,比如垃圾对象,它已经没有被其他地方引用,但是这些垃圾对象还可以引用其他没有被回收的对象,所以导致GC无法产生作用,一旦内存泄露累计到一定程度,就会造成内存移除。
三、有关bitmap的优化
答:内存溢出、内存抖动、内存泄露
第一点:图片的显示,当我们调用缩略图的时候,不要去调用网络加载大图。例如listview滑动的时候,显示缩略图即可,停止滑动的时候,在加载当前窗口可见的itme图片。第二点:及时释放内存,我们知道Android系统自己是有垃圾回收机制的,也就是java垃圾回收机制,它会不定期的回收掉不适用的内存空间(注意:不定期,不能手动控制)。这里面就包括了bitmap回收,但是我们都知道,bitmap的构造方法都是私有的,它是通过BitmapFactory这个类来实例化一个bitmap。而BitmapFactory所有的生成bitmap对象,都是通过调用jni这种方式实现的,所以说加载bitmap到内存以后,它是包含两部分内存区域的,一部分是java区,一部分是C区,而这个bitmap对象是由java来分配的,当不再用的时候,java回收机制就会回收掉java区不用的内存,但是C区的却不能被java回收机制回收的,这里就要我们调用底层功能来释放内存,这里讲的及时释放内存就是指的是C区的内存。
第三
a73d
点:图片压缩:加入我们加载一张很大的图片,这个大图直接超过了内存分配的大小,这样肯定会导致内存溢出。所以此时就会对图片的大小进行控制,也就是图片压缩。
第四点:可以使用inBitmap属性。它可以提高安卓系统在bitmap分配和释放的执行效率。百度查找。
四、其他方面
答:
第一:图片缓存用lru,lru是最进最少使用的缓存机制,他是一个三级缓存机制。第二:避免在onDraw方法里面执行对象的创建。如果你在此方法中频繁的调用创建对象的操作,你就会使内存突然上升,这样你在释放内存的时候又会引起频繁的GC,这样就会造成我们的内存抖动现象。而内存抖动积累到一定程度,也会造成内存溢出
第三点:谨慎使用多线程,代码会更复杂,逻辑更繁琐,增加了内存的开销。。
相关文章推荐
- 前端工作面试问题(先记录,后面再一一解答)
- 面试最后,你还有什么要问我的?
- 求职面试的一些记录
- 域名解析--什么是A记录、别名记录(CNAME)、MX记录、TXT记录、NS记录
- Atitit 如何做数据分析 描述型:发生了什么?可视化仪表盘化很重要。 1 2. 诊断型:为什么会发生?结合历史记录 1 3. 预测型:可能发生什么? 2 4. 指导型 规划未来行动:我需要做什
- log日志记录是什么
- C++面试宝典笔试题记录
- 面试杂谈:面试程序员时都应该考察些什么?<转>
- 面试最后,你还有什么要问我的?
- 记录面试需要的一些基本资料1
- 百度外卖面试记录
- 一次面试记录
- 什么是活动记录模式?
- 面试记录第十一节——(volley框架)
- 面试技巧:新人接到面试通知后做什么
- 京东面试记录
- Mariadb 分布式事务两阶段提交 binlog日志 查询日志 都记录了一些什么内容 以及恢复被丢失数据方式
- storm记录--2-- Storm是什么
- 面试记录
- 面试记录第二十二节——(lint检查)