android 如何使用命令和代码设置heapsize

android 如何使用命令设置heapsize


android中在涉及到需要分配大量内存的地方比如说图像处理,当dalvik对内存分配的过小会出现out of memory错误。

可以通过重新设置dalvik堆内存大小以及增长限制来解决这个问题。

Android命令行提供setprop和getprop这两个命令来设置Android系统的一些属性,就比如说虚拟机堆内存大小等等。

但这两个命令必须在root权限下设置才能生效,并且必须在root权限下重启shell

操作命令如下:

[cpp]  view plain copy
  1. adb root  
  2. adb shell setprop dalvik.vm.heapgrowthlimit 64m  
  3. adb shell setprop dalvik.vm.heapsize 192m  
  4. adb shell stop  
  5. adb shell start  
  6. adb shell getprop dalvik.vm.heapsize  


[Android内核修改]android heapsize内存大小修改

这里有一点有用的资料,贴一下链接:

http://www.cnblogs.com/qwhg/archive/2010/09/13/1824965.html

因为在开发的过程中,遇到了内存泄露造成程序无法正常启动的错误,而内存泄露是因为控件加载了过多外部图片造成的。这里,为了使图片加载成功,尝试修改了一下heapsize大小,改为64M,最终成功加载。具体步骤如下:

1)修改dalvik/vm/Init.c中的内容如下:

1
gDvm.heapSizeMax =  16  1024  1024 ;     // Spec says 75% physical mem

改为

1
gDvm.heapSizeMax =  64  1024  1024 ;     // Spec says 75% physical mem

2)修改frameworks/base/core/jni/AndroidRuntime.cpp中的内容如下:

1
property_get( "dalvik.vm.heapsize" , heapsizeOptsBuf+ 4 "16m" );

改为

1
property_get( "dalvik.vm.heapsize" , heapsizeOptsBuf+ 4 "64m" );

3)修改out/target/product/imx53_smd/system/build.prop中的内容如下:

1
dalvik.vm.heapsize=32m

改为

1
dalvik.vm.heapsize=64m

4)重新编译内核。


最终成功实现,大量图片加载成功。


以上内容参考了:

http://blog.csdn.net/andytsui/article/details/6358393

http://www.yunsite.net/forum.php?mod=viewthread&tid=761&extra=page%3D1

 模拟器上给 gallery 放入图片的时候,出现 java.lang.OutOfMemoryError: bitmap size exceeds VM budget  异常,图像大小超过了RAM内存。
模拟器 RAM 比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到 Bitmap 的时候,大小会变大,导致超出RAM内存,具体解决办法如下:

Java代码:
  1. //解决加载图片 内存溢出的问题
  2. //Options 只保存图片尺寸大小,不保存图片到内存
  3. BitmapFactory.Options opts = new BitmapFactory.Options();
  4. //缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰
  5. opts.inSampleSize = 4;
  6. Bitmap bmp = null;
  7. bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts); 
  8. ... 
  9. //回收
  10. bmp.recycle();
复制代码

通过上面的方式解决了,但是这并不是最完美的解决方式。
       通过一些了解,得知如下:

       优化Dalvik虚拟机的堆内存分配

       对于Android平台来说,其托管层使用的 Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用  dalvik.system.VMRuntime类提供的 setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法:  private final static float TARGET_HEAP_UTILIZATION = 0.75f;在程序 onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

       Android堆内存也可自己定义大小

       对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的  dalvik.system.VMRuntime类来设置最小堆内存为例:

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

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



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值