韓聰 海南工商職業學院
基于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)