J2ME手機開發之內存優化攻略

火星人 @ 2014-03-10 , reply:0


在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;
}
}
}




[火星人 via ] J2ME手機開發之內存優化攻略已經有104次圍觀

http://www.coctec.com/docs/java/show-post-62210.html