android 工厂测试内存,Android 内存溢出管理与测试

今天发现正在做的项目,时不时的会报错:dalvikvm heap out of memory on a 7458832-byte allocation (堆分配的内存溢出)

为什么会内存溢出呢?我以前从未遇见这种情况。后来在网上查了查资料,还是挺多的。

怎么说呢?因为Android开发基本上是以java语言为基础,那么程序是在java虚拟机上运行的。而虚拟机不允许单个程序中的Bitmap占用超过8M的内存,从报错的日志可以看出:7458832-byte大约就是7M多的样子,基本吻合上述数据。在我的项目中大量的使用到了各种图片,因此是因为图片导致内存溢出的的可能性很高。

那么,下面就提供一下解决方案:

第一种方案:

Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配(LZ没试过,不过网上很多人都说可行)。

强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理

第二种方案:

手动的回收内存。

示例代码如下:bit为Bitmap对象

if (bit != null && !bit.isRecycled()) {

bit.recycle();

bit= null;

}

System.gc();

bitmap.recycle()方法用于回收该bitmap所占用的内存,用System.gc()调用一下系统的垃圾回收器。

需要注意的是:回收内存要及时,比如说SurfaceView,就应该在onSurfaceDestroyed这个方法中回收。如果Activity使用了bitmap,就可以在onStop或者onDestroy方法中回收等等。

我首先就是用的这种方法,修改后发现bug出现的频率减小了,但仍然存在。

第三种方案:

既然是图的问题,那就从图片下手。就是使图片体积大小变小。

这也分为两个方面:

1、分辨率不变,图片大小减小2、分辨率改变,图片减小。(用PS都很容易的)

需要注意的是:不要减小得太小而影响了人眼看上去的美感。

以上三种方案,后两种较简单且常用。

另外,因为是Android的图片导致的内存问题,那么就总结了一下与图片相关的方法的性能,结果很有收获啊……(不看不知道,一看吓一跳)

测试的环境为:笔记本i3处理器,64位win7系统,测试手机为小米2S,测试图片大小为500KB

比较Drawable与Bitmap占用内存大小

比较BitmapFactory类的decodeResource方法与decodeStream方法的效率

以及优化后的BitmapFactory类的decodeResource方法。

下面贴上代码与运行图:(每次请只运行一个方法,隐藏另外的三种方法)

public class MainActivity extendsActivity {int number = 1000;

Drawable[] array;

Bitmap bitmap[];

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.main);

testDrawable();//testBitmap_decodeResource();//testBitmap_decodeStream();//testnewBitmap_decodeResource();

}/*** 优化后的BitmapFactory类的decodeResource方法*/

private voidtestnewBitmap_decodeResource() {

bitmap= newBitmap[number];for (int i = 0; i < number; i++) {

Log.i("", "测试第" + (i + 1) + "张图片");//压缩,用于节省BITMAP内存空间--解决BUG的关键步骤

BitmapFactory.Options opts = newBitmapFactory.Options();

opts.inSampleSize= 2;//这个的值压缩的倍数(2的整数倍),数值越小,压缩率越小,图片越清晰//返回原图解码之后的bitmap对象

bitmap[i] =BitmapFactory.decodeResource(getResources(),

R.drawable.begin_background, opts);

}

}/*** BitmapFactory类的decodeStream方法*/

private voidtestBitmap_decodeStream() {

bitmap= newBitmap[number];for (int i = 0; i < number; i++) {

Log.i("", "测试第" + (i + 1) + "张图片");

bitmap[i]=BitmapFactory.decodeStream(getResources()

.openRawResource(R.drawable.begin_background));//这里换了方法

}

}/*** BitmapFactory类的decodeResource方法*/

private voidtestBitmap_decodeResource() {

bitmap= newBitmap[number];for (int i = 0; i < number; i++) {

Log.d("", "测试第" + (i + 1) + "张图片");

bitmap[i]=BitmapFactory.decodeResource(getResources(),

R.drawable.begin_background);

}

}/*** Drawable的使用*/

private voidtestDrawable() {

array= newBitmapDrawable[number];for (int i = 0; i < number; i++) {

Log.w("", "测试第" + (i + 1) + "张图片");

array[i]=getResources().getDrawable(R.drawable.begin_background);

}

}

}

首先贴出   Drawable的使用   的运行结果:(顺利测试完1000张图片)

b551dda7ca2e50b69a645917cdf2e7a0.png

BitmapFactory类的decodeResource方法运行结果:(居然只有11张)

ce93ff103bcc20070376fc29ec92d3b0.png

运行优化后的BitmapFactory类的decodeResource方法:(优化后可达到46张,且opts.inSampleSize = n;N的参数设置得越大可达到的数量越多,但损失了图片质量)

5bb58c635381c497ec4a7b5a8da97fd9.png

BitmapFactory类的decodeStream方法:(可达22张图片)

b51c4a48925b85522c5571e09d1d53a3.png

这下,相信大家对Android中与图片相关的这几种方法的性能有直观的认识了吧。其实,在测试时除了看到数量外,还可以看到运行时间上的差距。

其实,综合上面产生bitmap方法,可以得出一种最优的方法:(环境以上面其他方法相同)

public voidtest() {

bitmap= newBitmap[number];for (int i = 0; i < number; i++) {

Log.i("", "测试第" + (i + 1) + "张图片");

BitmapFactory.Options options= newBitmapFactory.Options();

options.inSampleSize= 2;

bitmap[i]=BitmapFactory.decodeStream(getResources()

.openRawResource(R.drawable.begin_background),null,

options);

}

}

最终测试得到的数据是,可以测试80多张图片。(图片也与其他方法测试的相同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值