`

biemap内存溢出

阅读更多

android系统的手机在系统底层指定了堆内存的上限值,大部分手机的缺省值是16MB,不过也有些高配置的机型是24MB的,所以我们的程序在申请内存空间时,为了确保能够成功申请到内存空间,应该保证当前已分配的内存加上当前需要分配的内存值的总大小不能超过当前堆的最大内存值。由于内存管理上将外部内存完全当成了当前堆的一部分,也就是说Bitmap对象通过栈上的引用来指向堆上的Bitmap对象,而堆上的Bitmap对象又对应了一个使用了外部存储的native图像,也就是实际上使用的字节数组byte[]来存储的位图信息,因此解码之后的Bitmap的总大小就不能超过8M了。

解决这类问题的最根本的,最有效的办法就是,使用完bitmap之后,调用bitmap对象的recycle()方法释放所占用的内存,以便于下一次使用。

下面是网上找到的一些常用的优化办法,但是基本上都不能从本质上解决问题。

1.设置系统的最小堆大小: 

int newSize = 4 * 1024 * 1024 ; //设置最小堆内存大小为4MB  
VMRuntime.getRuntime().setMinimumHeapSize(newSize);  
VMRuntime.getRuntime().setTargetHeapUtilization(0.75); // 设置堆内存的利用率为75%  

 补充说明:堆(HEAP)是VM中占用内存最多的部分,通常是动态分配的。堆的大小不是一成不变的,当堆内存实际的利用率偏离设定的值的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。比如初始的HEAP是4M大小,当4M的空间被占用超过75%的时候,重新分配堆为8M大;当8M被占用超过75%,分配堆为16M大。倒过来,当16M的堆利用不足30%的时候,缩减它的大小为8M大。重新设置堆的大小,尤其是压缩,一般会涉及到内存的拷贝,所以变更堆的大小对效率有不良影响。

2.对图片的大小进行控制

BitmapFactory.Options options = new BitmapFactory.Options();  
options.inSampleSize = 2; //图片宽高都为原来的二分之一,即图片为原来的四分之一  
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg",options); 
//或bitmap = BitmapFactory.decodeStream(new FileInputStream(file),null,options);

 补充说明:这种方法只是对图片做了一个缩放处理,降低了图片的分辨率,在需要保证图片质量的应用中不可取。

3.

BitmapFactory.Options options = new BitmapFactory.Options();  
options.inTempStorage = new byte[1024*1024*5]; //5MB的临时存储空间  
Bitmap bm = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg",options);  

 补充说明:从创建Bitmap的C++底层代码BitmapFactory.cpp中的处理逻辑来看,如果option不为null的话,那么会优先处理option中设置的各个参数,假设当前你设置option的inTempStorage为1024*1024*4(4M)大小的话,而且每次解码图像时均使用该option对象作为参数,那么你的程序极有可能会提前失败,经过测试,如果使用一张大小为1.03M的图片来进行解码,如果不使用option参数来解码,可以正常解码四次,也就是分配了四次内存,而如果使用option的话,就会出现内存溢出错误,只能正常解码两次。Options类有一个预处理参数,当你传入options时,并且指定临时使用内存大小的话,Android将默认先申请你所指定的内存大小,如果申请失败,就会先抛出内存溢出错误。而如果不指定内存大小,系统将会自动计算,如果当前还剩3M空间大小,而解码只需要2M大小,那么在缺省情况下将能解码成功,而在设置inTempStorage大小为4M的情况下就将出现内存溢出错误。所以,通过设置Options的inTempStorage大小也不能从根本上解决大图像解码的内存溢出问题。

总之再做android开发时,出现内存溢出是属于系统底层限制,只要解码需要的内存超过系统可分配的最大内存值,那么内存溢出错误必然会出现。

分享到:
评论

相关推荐

    基于matlab平抑风电波动的电-氢混合储能容量优化配置【含Matlab源码 期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    dynamic_unet-0.0.2-py3-none-any.whl

    dynamic_unet-0.0.2-py3-none-any.whl

    基于Java语言的动态二维码生成与绘制设计源码

    该项目是一款基于Java语言的动态二维码生成与绘制设计源码,包含126个文件,包括64个JAR包、24个PNG图片、17个GIF动画、10个XML配置、7个Java源文件、2个Markdown文件、1个Idea项目配置文件和1个JPG图片文件。该项目通过图像生成动态二维码,适用于需要动态二维码绘制的场景。

    go1.23.1.linux-amd64.tar.gz

    golang linux amd63 sdk

    JavaScript高分作品《微信小程序-图书馆管理系统》+源代码+文档说明

    <项目介绍> - 微信小程序—图书馆管理系统 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    Win实现Mac一样的流畅丝滑

    ψx60wyycaqwin25rψ Win实现Mac一样的流畅丝滑

    Java2Top -「Java学习+面试指南+编程资源」

    Java2Top |「Java学习+面试指南+编程资源」一份涵盖 Javacoder 从零基础到进阶大厂的全面学习与面试指南~。

    基于Springboot和Vue的疫情管理系统源码 疫情管理系统代码(程序,中文注释)

    疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统 1、资源说明:疫情管理系统源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Windows ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDE

    基于matlab粒子群综合能源系统优化【含Matlab源码 期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    af4fff13f6f2a7594ca86979127f5212.JPG

    af4fff13f6f2a7594ca86979127f5212.JPG

    德国大陆24GHz短距宽角毫米波雷达ARS408,SRR308技术资料含DBC

    德国大陆24GHz短距宽角毫米波雷达ARS408,SRR308技术资料含DBC

    基于Springboot和Vue的大学生一体化服务平台源码 大学生一体化服务平台代码(程序,中文注释)

    大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台 1、资源说明:大学生一体化服务平台源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Window

    基于asp.net的语言课程网设计与实现.docx

    基于asp.net的语言课程网设计与实现.docx

    基于Java语言的lib-android-PermissionHelper封装Android M运行时权限申请设计源码

    该项目为Java语言编写的Android运行时权限申请封装库,名为lib-android-PermissionHelper,源码包含59个文件,涵盖20个XML配置文件、14个Java源文件、7个PNG资源文件、5个Gradle构建脚本文件、3个Git忽略规则文件以及若干其他辅助文件。此库专注于Android M及以上版本的权限申请流程封装,旨在简化开发者对运行时权限的申请处理。

    基于Vue框架的hao123程序员网址导航设计源码

    该项目是一款基于Vue框架构建的程序员网址导航系统源码,包含136个文件,包括56个PNG图片、49个ICO图标、11个Vue组件文件、5个JavaScript文件以及少量JSON、YAML和其他配置文件。该系统以简洁明了的界面,为程序员提供便捷的网址导航服务。

    基于c语言的力学相关的流体源码.zip

    基于c语言的力学相关的流体源码.zip

    基于c语言的自创军旗游戏源码.zip

    基于c语言的自创军旗游戏源码.zip

    基于 OpenCV 构建的基于边缘的车道线检测器

    该程序对帧率很敏感,因此需要针对不同的视频进行进一步的参数调整。 当前参数针对 CULane 数据集进行了调整,该数据集的帧速率非常低(我猜,它们每秒只挑选一小部分录制的帧以减小数据集的大小)。它在 上运行得相当不错,这是一个 24 FPS 视频,但如果置信度指数的降低率和容忍范围较低,那就更好了。如果您尝试 60 FPS 的视频,除非您知道如何调整参数,否则这种现象会更严重。

    基于Html+JavaScript+Java的相机租赁系统设计源码

    该项目是一款基于Html、JavaScript和Java的相机租赁系统源码,综合运用前端与后端技术,包含265个文件,其中HTML文件31个,JavaScript文件56个,Java文件45个,CSS文件23个,PNG图片53个,以及其他类型的文件如XML、properties等。该系统旨在提供相机租赁管理的便捷解决方案,支持用户交互和数据处理。

    windows qt 实现守护进程 监控 子进程状态 demo

    1、守护进程启动子进程 2、子进程异常退出,守护进程自动重启子进程 3、子进程正常退出,守护进程退出 4、守护进程退出,子进程退出 5、模拟子进程崩溃闪退情况

Global site tag (gtag.js) - Google Analytics