描述
在执行图片加载或使用bitmap时,图片过大会出现Failed to allocate a 65109516 byte allocation with 4191168 free bytes and 56MB until OOM
过程
经过计算确实发现是由于设备内存不够导致的现象,也是与bitmap或图片加载时占用内存过大导致
测试
方案
通过网上查询,找到方法为添加
android:largeHeap="true"
android:hardwareAccelerated="false"
添加位置为AndroidManifest.xml
<application
android:name=".my.ImApplication"
android:largeHeap="true"
android:hardwareAccelerated="false"
android:theme="@style/AppTheme">
调试
通过profiler的内存分析如下图,初步分析相较于未添加前会稍小,但少的有限 继续进行多次的任务添加,观察到内存逐渐增加,且最后抵达峰值后,apk崩溃,经过对设备物理内存分析,确定内存确实被消耗完毕
largeHeapde作用
而android:largeHeapde的作用为让应用能申请使用更多的内存,通过adb shell getprop发现
[dalvik.vm.heapgrowthlimit]: [128m]
[dalvik.vm.heapsize]: [256m]
这里heapgrowthlimit就是一个普通应用的内存限制,用ActivityManager.getLargeMemoryClass()获得的值就是这个。而heapsize是在manifest中设置了largeHeap=true之后,可以使用最大内存值。设置largeHeap的确可以增加内存的申请量。但不是系统有多少内存就可以申请多少,而是由dalvik.vm.heapsize限制。 通过对比,发现android:largeHeapde确实将内存限制突破,但是回退版本至未添加android:largeHeap时,实际上也将内存限制突破,而根据可能与本人的apk版本的权限为系统级。 以上:发现android:largeHeapde并无大用处,但是相较于未添加时至少有轻微的好转。 而当添加了android:largeHeapde后,进行usbcamera时却出现崩溃现象,而现象原因在于另一句内容:android:hardwareAccelerated=“false”
hardwareAccelerated作用
主要功能是启用硬件加速,而缺点是占用内存 从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的。因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。 启用硬件加速的最容易的方法是给整个应用程序都打开全局硬件加速功能。如果应用程序只使用标准的View和Drawable,那么打开全局硬件加速不会导致任何的不良的绘制效果。但是,因为硬件加速并不支持所有的2D图形绘制操作,所以对于那些使用定制的View和绘制调用的应用程序来说,打开全局硬件加速,可以会影响绘制效果。问题通常会出现在对那些不可见的元素进行了异常或错误的像素渲染。 而使用usbcamera需要用到硬件加速,故导致设备的usb启动问题。
总结
该方案可能存在一定的可行性,但是在本人项目中的优化不明显,且导致其他问题,故不可采用该方法
相关链接: https://blog.csdn.net/handingnihao/article/details/111946324
|