韩聪 海南工商职业学院
基于Android的图片处理系统中内存溢出优化方法
韩聪 海南工商职业学院
随着智能手机摄像头像素的不断提高和智能手机自带图片处理软件、三方摄影软件的不断改进,内存利用问题不容忽视。如何让图片处理软件流畅、稳定,避免因内存溢出造成系统频繁出问题,成为开发者必须解决的问题。本文旨在解决该问题。先对相关技术原理进行分析得出内存溢出原因,再提出优化方法。
图片处理 内存溢出 优化
Android操作系统(安卓)是谷歌开发的,是一款基于Linux内核设计的操作系统。因Linux完全免费开放,且所需配置不高,越来越多的企业及政府投入研究及使用,Android迅速变成全球应用最广泛的智能手机操作系统。Android操作系统能够对图片进行简单的出来了,同时支持三方摄影软件对图片进行美化处理。随着图片处理系统功能的不断改进,处理图片时所需的内存也更多,出现了out of memory(内存溢出)。
内存溢出(out of memory)即内存不够用。图片处理软件处理大量图片时需要的内存很大,主机所提供的内存不能承载大量图片时软件无法运行,系统会自动退出或提示内存溢出。OOM带来很多问题。内存溢出仅到缓冲区,程序仍然可以调用丢失的信息或子程序的列表信息。这种情况重启手机或者清除缓存释放内存软件就可以正常运行了。内存溢出超出缓冲区,软件不能正常完成任务。溢出的数据会覆盖计算机内存中原有信息。若被覆盖的信息不能恢复将会永远丢失。
Android设计的理念是“应用程序关闭而不退出”,应用程序关闭依然要占用内存。谷歌数据显示,假设智能手机操作系统的内存是64M,高级系统服务大概需要20M内存,该手机内核大概需要24M内存,手机仅剩不到20M内存留给应用程序。手机更新换代后,内存升级为了32G、64G,但内核的内存占用量、高级系统服务内存的占用量也随之增大,应用程序的可用内存还是有限。
1.1 内存管理机制
Android操作系统对内存分配的可修改性不大,而内核层及系统运行库层和应用程序框架层却可以修改。应用程序框架层内存管理主要体现在Ams。内存回收时体现在两个当面,支持low memory killer设置进程的优先级别,否则提供一套默认的内存回收方案。内核层及系统运行库内存的管理主要是运行程序调用GC申请内存。若能够回收足够的内存则GC停止,否则内存溢出应用程序终止。
1.2 图片占用进程的内存算法
Android中处理图片使用Bitmap(位图)的基础类。图片处理时占用内存计算方法是height*width*Config。假如Config设置为ARGB则Config=4。一张720480存就是720*480*4字节。把手机设置调为默认设置,图片需要16M内存。Bitmap包含在底层C++的skia图形库中的SKBitmap对象,也包含java中数据。建议图片占用内存要小于8M。
(1)一次性从数据库中取出的数据量大,超出内存能够加载的上限。
(2)引用对象在集合类中使用后没有及时清空引用对象,JVM不能回收。
(3)程序中存在死循环、很多重复的对象实体。
(4)在启动参数时内存值设置的不够大。
(1)对代码进行反复检测排除死循环、重复的对象实体。
(2)避免启动参数时对内存值设置的不够大。
(3)避免一次性从数据库中获取出的数据量过大,超出内存能够加载的上限。
(4)加载图片时对图片进行等比例压缩。
(5)及时回收内存,在图片处理系统中加入图1-3中的语句。
图1-3
(6)减小内存消耗量。直接调用JNI>>nativeDecodeAsset()来完成decode,所以在调用图片时通过BitmapFactory.decodeStream方法,创建bitmap,再将其设为ImageView的source,decodeStream。在读取时加上图片的Config参数,很明显图片加载内存就减少了,内存溢出问题可以有效解决。
手机硬件配置越来越高,用手机拍出来的照片占用内存量越来越大,图片处理时占用的内存也越来越大。内存直接影响一个应用程序能不能正常使用,所以开发者找出解决内存溢出问题的解决方案非常重要。
[1]王华旭.Android平台图像处理软件框架的开发与设计
[J].软件.2014(02)
[2]申文.基于Android的图片产品设计与实现[D].华中科技大学2011
[3]江志俭.基于Android平台多功能特效相机的设计与实现[D].大连理工大学2011
[4]曹帮琴.徐昊.Android应用中优化Bitmap使用避免内存溢出[J].河南工程学院学报(自然科学版)2014.26(2)