J2ME手機開發之內存優化攻略
??????嚴正聲明:本文出自即興詩人blogjava博客,作者經過整理總結而得,如轉載必需與作者聯系improviser@163.com!
??????在C或C++開發過程中,內存溢出問題可謂是經常讓開發人員極其痛苦的事情,稍不注意問題就產生,甚至引發隱含的漏洞產生。JAVA正是在C++的優秀品質中繼承下來的產物,擁有垃圾回收機制是JAVA虛擬機在C++繼承過程中進化的一個重要地方,垃圾回收機制能在對象沒被使用之后的某個時間將對象進行回收,從而能使無用對象占據的內存得到釋放。但是,這僅僅對有足夠內存的Server服務器主機跟PC機上的虛擬機有用,對于內存極其珍貴的設備來說垃圾回收機制卻顯得有點無能為力,英雄無用武之地。雖然隨著手機硬件的不斷升級,智能手機中的手機內存以及CPU資源大大得到提升,但是目前用戶手中的手機并無法普遍達到這種水平,因此在J2ME設計開發過程中我們需要很好的考慮到每一寸內存土地的利用。今天參考了有關資料,并對J2ME開發過程中的內存相關內容做個歸納,以增加對內存的使用有更好的理解。
??????一、程序內存情況分析
??????1、在使用WTK中,我們可以調用工具中的Memory Monitor來查看程序的內存使用情況。
??????2、使用相對于的手機模擬器內存監視器來對程序使用內存進行監視。
??????3、Runtime類提供了查看剩余內存的方法freeMemory()。
??????二、程序內存占用分析
??????一個軟件在運行過程中占據內存主要是程序代碼和程序所使用的各類資源,包括文字文件資源、圖片、音樂等多媒體資源。
????? 而在JAVA虛擬機中,java代碼最終是被編譯成class文件的字節碼形式并且隨著程序的啟動而加載到內存中,因此經過編譯之后的字節碼文件的容量大小,將會影響程序最終占用內存的大小,而字節碼文件的大小則是由程序代碼中類的個數、變量名稱以及方法名的長度、字符串以及靜態常量的長度和大小等因素決定的。
??????在手機應用程序中特別在游戲開發中,都需要使用各類的資源,使得游戲內存豐富多彩,而這些資源將是程序占據更多資源的原因。同樣的,在游戲場景中,設計到很多對話內容,因此涉及到很多文字存儲文件(使用文件存儲而不是在程序中聲明字符串的作用是在需要時候才讀取內容,防止過多字符串占據過大內存)。
??????聲音也是一種極其占據內存的資源,因此在程序當中也需要對聲效等資源的控制。
??????三、內存優化方法攻略
??????1、代碼優化
??????盡量使用較短的變量名稱和方法名稱,減少類中成員變量跟成員方法的數量,多使用局部變量而少使用全局變量,減少程序總體的代碼行數,在程序測試確定無錯情況下可以去掉異常處理的try-catch語句,對常量跟字符串過多的程序中使用文件存儲形式以使用時候再讀取,對不使用的對象及時指向為null,對占據大內存的程序或資源的數據流讀取使用后及時釋放資源并使用System.gc()方法回收垃圾資源。
??????2、圖片優化
??????在圖片使用中,我們通常使用圖形壓縮工具或算法對圖片大小進行壓縮,但是這樣的作用僅僅是較小了J2ME程序最終產生的JAR文件包大小,但無法減少圖片在被使用時候對內存的消耗。據有關資料介紹,圖片的內存在內存中的大小只跟圖片被裝載后的高度跟寬度有關,而跟圖片本身體積大小無關,計算公式為內存占用量=寬*高*像素字節數。
??????因此在圖片優化中可以使用減小圖片的高寬、使用圖片分割編輯工具對圖片進行分割,充分利用圖片的空間;在使用的時候才載入相關的圖片,而在無用的時候及時銷毀圖片對象;對每一張圖片聲明一個對象變量。
??????3、聲效資源優化
??????對聲音采用字節流ByteArrayInputStream來創建Player對象;在對聲音對象的回收前停止聲音的播放;其次在每次播放聲音前先對聲音對象進行判斷,如對象存在則先停止后再進行播放。
??????4、有關字符串處理
??????對字符串的處理使用StringBuffer來操作,因為使用方法append時是同一個對象上的操作,而如果采用“+”操作字符串則會每次創建新的對象。
??????5、對循環的優化
??????盡量在for循環語句中將size或length等計算提取到循環外面,如下所示(對數組num{23,13,46,26,22,57}進行排序):
??????int k = num.length;
??????for(int i=0;i<k-1;i++)
??????{
???????????????for(int j=1;j<k;j++)
??????????????????{
????????????????????????if(num[i]<=num[j])
????????????????????????{
???????????????????????????????????int temp = num[i];
???????????????????????????????????num[i] = num[j];
???????????????????????????????????num[j] =?temp;
????????????????????????}
??????????????????}
???????}
????????下篇文章J2ME手機開發之內存優化攻略(續)將繼續敘述有關代碼優化的內存。
????????二零零九年二月二十八日于東莞東陽光
??????? 嚴正聲明:本文出自即興詩人blogjava博客,作者經過整理總結而得,如轉載必需與作者聯系improviser@163.com!
?
鳳凰涅槃/浴火重生/馬不停蹄/只爭朝夕
???? 隱姓埋名/低調華麗/簡單生活/完美人生
posted on 2009-02-28 19:35 poetguo 閱讀(1514) 評論(0) 編輯 收藏 所屬分類: J2ME