Android面试之内存溢出解决

来源:互联网 发布:练五笔打字的软件 编辑:程序博客网 时间:2024/06/13 09:14

1.内存引用

  释放强引用

 Object obj = new Object();

 我们声明完,使用完就不管了,认为垃圾回收器会回收对象指向的内存空间

只要对象被引用,垃圾回收器就不会回收

object = null;

之后,垃圾回收器会在一定时候回收

2.图像处理

(1)通常比较大的图像会在内存里压缩,

Options bitmapFactoryOptions = new BitmapFactory.Options();

bitmapFactoryOptions.onSampleSize=2;

bmap = BitmapFactory.decodeFile(picture.getAbsolutePath(),

          bitmapFactoryOptions);

通过路径装载图像时,要指定第二个参数bitmapFactoryOptions,指定压缩比例

在内存中按一定比例压缩,2就是按常宽的50%压缩

比较大的图片不压缩一定会溢出的,一两兆的图片就会内存溢出

系统为每个安卓应用分配内存,而不是把整个内存都分配。对于每个app分配的内存比较少

装载比较大的图片就会内存严重不足

电脑上可以申请虚拟内存,移动设备上没有,不够就是不够,造成Out of Memory

所以装载大图像要进行压缩。1024*768可以按4或8压缩

(2)图片用完时,外部释放了,但是内部有些空间没有释放(内部C语言实现的地方)

if(bitmapObject.isRecycled()==false)

{

       bitmapObject.recyle();

      system.gc()//提醒gc回收

}

system.gc()并不马上回收,devic虚拟机会在合适的时候回收

3.VMRuntime

2.3以前提供,不需要掌握


http://www.importnew.com/8715.html

如何阻止内存泄漏?

以下是一些阻止内存泄漏的快速动手技巧。

(1)注意集合类,例如HashMap,ArrayList,等等。因为它们是内存泄漏经常发生的地方。当它们被声明为静态时,它们的生命周期就同应用程序的生命周期一般长。

(2)注意事件监听器和回调,如果一个监听器已经注册,但是当这个类不再被使用时却未被注销,就会发生内存泄漏。

(3)“如果一个类管理它自己的内存,程序员应该对内存泄漏保持警惕。”[1] 很多时候当一个对象的成员变量指向其他对象时,不再使用时需要被置为null。

1.什么是内存泄漏?

内存泄漏的定义: 对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用。



0 0
原创粉丝点击