使用largeHeap为app增加可使用内存

  在平时的开发中,难免会遇到OOM,特别是处理Bitmap对象的时候,造成OOM的原因,一般有代码设计不合理,内存泄漏,内存不能得到释放,也有可能是系统为你的App分配的内存实在太小。
  在最近的项目中,需要一个拍照功能,调用系统相机拍照,并对照片进行了方向调整(手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向的,即拍照后的照片如果竖屏展示,可能不是正的,具体手机的偏转方向有所差别),添加水印(手机当前的gps信息和时间),进行压缩,最后以缩略图展示。由于没有使用别人封装好的第三方库,实现起来耗费了一些时间,最后测试阶段,发现大多数手机都已经正常工作,唯独自己的一只三星的S5,一直会OOM,利用Android studio 的Monitor一看,内存跑到100MB程序就挂了,于是我就是用了largeHeap为虚拟机扩大了可用内存。
  基础概念铺垫:
  虚拟机的运行时内存一般由堆和栈两大部分构成。
  栈是存储方法调用的一片内存数据区。
  堆内存占据了虚拟机的大部分内存空间,程序执行时产生的对象就分配在堆内存上。
  如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError
  

largeHeap如何使用:

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

在AndroidManifest.xml中的application节点添加一句android:largeHeap=“true” 即可。

largeHeap能增加多大内存

我们可以通过以下两个方法查看我们内存的大小
ActivityManager.getMemoryClass()获得内用正常情况下内存的大小
ActivityManager.getLargeMemoryClass()可以获得开启largeHeap最大的内存大小
在Android系统中,在 /system/build.prop ,存放着关于dvm分配内存大小的配置信息,如下。

dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=128m
dalvik.vm.heapsize=512m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=2m
dalvik.vm.heapmaxfree=8m

dalvik.vm.heapstartsize=8m

相当于虚拟机的 -Xms配置,该项用来设置堆内存的初始大小。

dalvik.vm.heapgrowthlimit=128m

相当于虚拟机的 -XX:HeapGrowthLimit配置,该项用来设置一个标准的应用的最大堆内存大小。一个标准的应用就是没有使用android:largeHeap的应用。

其中dalvik.vm.heapsize=512m

相当于虚拟机的 -Xmx配置,该项设置了使用android:largeHeap的应用的最大堆内存大小。

检验效果:
在代码中使用
Log.e("memory:",Runtime.getRuntime().maxMemory()+"");//输出最大可用内存
Log.e("memory:",Runtime.getRuntime().freeMemory()+"");//输出当前可用内存

这里写图片描述
这是正常情况下的最大可用内存。
这里写图片描述
使用largeheap后明显能够看到使用的内存大于了没设置过的128mb。
这里对可用内存进行一个说明:当初始化的可用内存不能满足需求时,系统自动将可用内存扩充,所以看到这里可用内存只有9MB的童鞋不需要担心,但最大不得超过最大可用内存

补充说明:设置largeHeap是不需要权限的,系统GC回收从2.3开始引入并发的方式,所以使用largeHeap是从4.0开始支持,对系统GC影响微乎其微,其实使用largeHeap是指标不治本的,最主要的还是应该通过代码上去查找问题解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值