面试记录第十四节——(什么是oom)

来源:互联网 发布:编写php用什么软件 编辑:程序博客网 时间:2024/05/18 17:56

一、什么是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区的内存。

第三点:图片压缩:加入我们加载一张很大的图片,这个大图直接超过了内存分配的大小,这样肯定会导致内存溢出。所以此时就会对图片的大小进行控制,也就是图片压缩。

第四点:可以使用inBitmap属性。它可以提高安卓系统在bitmap分配和释放的执行效率。百度查找。


四、其他方面

答:

第一:图片缓存用lru,lru是最进最少使用的缓存机制,他是一个三级缓存机制。

第二:避免在onDraw方法里面执行对象的创建。如果你在此方法中频繁的调用创建对象的操作,你就会使内存突然上升,这样你在释放内存的时候又会引起频繁的GC,这样就会造成我们的内存抖动现象。而内存抖动积累到一定程度,也会造成内存溢出

第三点:谨慎使用多线程,代码会更复杂,逻辑更繁琐,增加了内存的开销。。

原创粉丝点击