JAVA內存優(yōu)化編程的三個方法
30 2017-04-14
南寧達內:JAVA內存優(yōu)化編程的三個方法
內存會溢出肯定和代碼逃不了關系,99.99%學java的人都知道垃圾回收器是java的一大優(yōu)點并據(jù)此來嘲笑C++.顯然這個特性為代碼編寫者省了不少事,但這個特性卻帶來了不少隱患.舉個例子在游戲當中經常有不同場景的切換,如從游戲邏輯退到主菜單邏輯,對游戲邏輯對象的態(tài)度很多人會選擇忘記等待垃圾回收器來收尸.乍看之下似乎并無不妥垃圾回收器會來善后.實際上垃圾回收器并非實時的,它不像C++的Delete語句馬上釋放不用的內存.當從游戲邏輯切換到主菜單邏輯這時兩個對象同時存在很可能這時內存就不夠用了.讀到這里很多人會發(fā)現(xiàn)實際上垃圾回收器在j2me上并不怎么好用,從一個角度上來講在j2me上所有垃圾必須由手工釋放,除簡單類型以外所有對象都必須顯式地置空例如imgs=null;實際上java提供了一個不錯的工具用來查找內存溢出,java.lang.Runtime.freeMemory().它可以返回當前的剩余內存數(shù),將它適當?shù)陌卜旁诖a中可以有效的監(jiān)測內存使用狀況.很大一部份的j2me程序員之前都是從事pc軟件開發(fā)工作,充裕的內存掩蓋了許多寫代碼的不良習慣.如下所示:
//a不為空
a=newLogic();
很多人可能對此有異議,他們會認為新的對象會把舊的對象沖掉并且釋放內存.這里面包含兩個問題:1.該段代碼是先創(chuàng)建對象然后再進行賦值操作的,也就是說在這期間有兩個對象同時存在這就很可能會產生溢出.2.這樣做也會妨礙垃圾回收器的工作
較好的寫法如下:
a=null;
a=newLogic();
雖然麻煩了點但在j2me中還是必要的.接著看下例.
drawString(“游戲時間:”+time,50,50,Graphics.LEFT|Graphics.TOP);
“游戲時間:”+time很完美在paint()方法當中每次都被刷一遍顯示在屏幕上.危機往往隱藏在美麗的外表,該語句會引起新的內存重新分配來存儲“游戲時間:”+time而顯示完以后又必須由垃圾回收器釋放,用了雙倍時間,并且容易發(fā)生內存溢出.依此類推在重復執(zhí)行的方法里應盡量避免重復定義對象.與paint()方法類似在循環(huán)里也有類似的情況存在.
把所有對象的初始化放在構造函數(shù)里想必是再正當不過了,大多數(shù)人通常的做法是把當前邏輯所要用到的資源通通初始化完畢.
很大一部份的內存溢出都是發(fā)生在構造函數(shù)中.內存使用的高峰期都是在構造函數(shù)中所以避開這個高峰能有效的防止溢出.建議最好的辦法是第一次使用時初始化.如下所示:
if(img==null){
//初始化
}
現(xiàn)在做游戲很多時候都需要地圖數(shù)組,聲音數(shù)組,還有一些其它資源這些資源很多可以放在代碼中也有的可以放在文件當中.
強烈建議將這些資源放在文件中需要時在load進來.這些資源文件如果放在代碼中則會占用不小的代碼段空間,而代碼一般是程序一運行就裝載到內存當中.
除上面列舉的方法外還有一些大家所熟知的順便一提,比如關閉沒用的rms,關閉沒用的網絡連接,關閉沒用的流.正確地停止線程.良好的程序架構減少代碼偶合性也是一個不錯的方法,無論在代碼調式,內存釋放都可以做到非常清析.
二.圖片優(yōu)化
j2me的內存殺手無疑非圖片莫屬,一張3k的圖片可以占用20多k的內存不信大家把load前后的內存剩余打印出來對比看看.所以防止內存溢出最直接的辦法就是從圖片入手.
圖片壓縮:多數(shù)人馬上會想到這個辦法.不錯這個辦法是最有效的.在photoshop里圖片制作完成后不要選擇“存儲為”,而是選擇“存儲為web所用格式”可以根據(jù)里面的選項進行壓縮,特別是顏色這一項越小越好不過相應的圖像會有所失真.不要認為這樣就完了.
實際上該圖片還可以再次壓縮,在網上有許多類似的工具.推薦一款可以壓縮png格式的軟件xatImageOptimizer效果不錯.經常都有70%的壓縮率且圖像不會失真.
假如你有多張規(guī)格一樣的圖片,那么建議你把它做成一張長條圖片.有兩個原因:
1、這樣節(jié)省存儲空間和內存空間.大家可做個試驗將10張圖片的內容放在一張當中對比看看文件大小有沒有變化.
2、10張圖片需要10個image對象需要進行10次io操作浪費時間不說還浪費內存.當筆者發(fā)現(xiàn)這個好處時興奮地把所有圖片都存成一張,吱地一聲內存又溢出了...原因想必大家也知道!!圖片太大了不要把不同界面的圖片整合在一起否則經常會得不償失.
作圖時還有一些細節(jié)需要注意,顏色數(shù)量,分辯率,圖像模式(最好是索引顏色),畫布大小都會影響到圖片大小.
三.工具優(yōu)化
誰都知道混淆器是用來保護代碼的以加大反編譯的難度(個人認為這是在嘲笑程序員的智商).實際上用它來優(yōu)化程序也是不錯的選擇,至少有兩點好處:
1、壓縮程序大小.一個60k的程序經??梢詨旱?0k左右.10k的空間對于寫低端手機的程序員簡直是雪中送碳,多少超過64k限制的游戲都受過它的恩惠;
2、節(jié)省內存空間.用腳去想也想得出來代碼少了內存里的代碼段自然就短了.
掃一掃
獲取更多福利
獵學網企業(yè)微信
獵學網訂閱號
獵學網服務號