西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)Android → andorid編程中內(nèi)存管理優(yōu)化

andorid編程中內(nèi)存管理優(yōu)化

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2011/4/25 7:16:24字體大。A-A+

作者:西西點(diǎn)擊:478次評(píng)論:1次標(biāo)簽: andorid編程

  • 類型:音頻處理大。1M語(yǔ)言:中文 評(píng)分:5.1
  • 標(biāo)簽:
立即下載

andorid 我們?nèi)绾喂芾砟愕膬?nèi)存?
tank前面做項(xiàng)目時(shí)遇到了一個(gè)錯(cuò)誤:java.lang.OutOfMemoryError
我當(dāng)時(shí)就沒(méi)有花很多時(shí)間去處理內(nèi)存這個(gè)問(wèn)題。當(dāng)時(shí)就以自己JAVA編程時(shí)的習(xí)慣以為像PC編程一樣,自顧的一頓敲下去。
因?yàn)榍懊嫖乙灿凶銮度胧椒矫娴拈_(kāi)發(fā),當(dāng)時(shí)是基于純C的嵌入式開(kāi)發(fā),在程序開(kāi)發(fā)時(shí)格外的小心指針和內(nèi)存的分配,一不小心就會(huì)造成把機(jī)子內(nèi)存泄露最后導(dǎo)致死機(jī)。
因?yàn)镴AVA里沒(méi)有指針,也不能像C里一樣Malloc和free,JAVA是自己管理內(nèi)存的分配和釋放所以我一開(kāi)始也不把內(nèi)存放在心上,直致java.lang.OutOfMemoryError。
尤其在處理大量圖像和做游戲開(kāi)發(fā)時(shí)會(huì)經(jīng)常碰到這類問(wèn)題,所以要額外注意了。
以下我總結(jié)和歸納了下內(nèi)存方面的東東,希望大家一起交流進(jìn)步,有誤之處請(qǐng)大家指正和完善。
如何優(yōu)化內(nèi)存管理:
1.在循環(huán)內(nèi)盡量不要使用局部變量。
2.不用的對(duì)象可以把它指向NULL,并注意自己的代碼質(zhì)量。
3.顯示讓系統(tǒng)GC回收
if(bitmapObject.isRecycled()==false) //如果沒(méi)有回收
         bitmapObject.recycle();   //http://www.cnblogs.com/tankaixiong/
4.對(duì)大型圖片進(jìn)行縮放有,處理圖片時(shí)我們經(jīng)常會(huì)用到BitmapFactory類,android系統(tǒng)中讀取位圖Bitmap時(shí)分給虛擬機(jī)中圖片的堆棧大小只有8M。
用BitmapFactory解碼一張圖片時(shí),有時(shí)也會(huì)遇到該錯(cuò)誤。這往往是由于圖片過(guò)大造成的。這時(shí)我們需要分配更少的內(nèi)存空間來(lái)存儲(chǔ)。
BitmapFactory.Options.inSampleSize設(shè)置恰當(dāng)?shù)膇nSampleSize可以使BitmapFactory分配更少的空間以消除該錯(cuò)誤。inSampleSize的具體含義請(qǐng)參考SDK文檔。Android提供了一種動(dòng)態(tài)計(jì)算的

方法,可以去查看源碼,這里不多講。
例如:
     BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 4 ;
    Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);
5.Dalvik.VMRuntime類,提供對(duì)虛擬機(jī)全局,Dalvik的特定功能的接口。
Android為每個(gè)程序分配的對(duì)內(nèi)存可以通過(guò)Runtime類的 totalMemory() freeMemory() 兩個(gè)方法獲取VM的一些內(nèi)存信息,對(duì)于系統(tǒng)heap內(nèi)存獲取,可以通過(guò)Dalvik.VMRuntime類的

getMinimumHeapSize() 方法獲取最小可用堆內(nèi)存,同時(shí)顯示釋放軟引用可以調(diào)用該類的gcSoftReferences() 方法,收集可用內(nèi)存。
我們還可以強(qiáng)制定義自己軟件的對(duì)內(nèi)存大小,我們使用Dalvik提供的 dalvik.system.VMRuntime類來(lái)設(shè)置最小堆內(nèi)存為例:

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //設(shè)置最小heap內(nèi)存為6MB大小。當(dāng)然對(duì)于內(nèi)存吃緊來(lái)說(shuō)還可以通過(guò)手動(dòng)干涉GC去處理,我們將在下次提到具體應(yīng)用。

使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強(qiáng)程序堆內(nèi)存的處理效率。當(dāng)然具體原理我們可以參考開(kāi)源工程,

 這里我們僅說(shuō)下使用方法:
 private final static float TARGET_HEAP_UTILIZATION = 0.75f;

在程序onCreate時(shí)就可以調(diào)用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

6.緩存,適量使用緩存,不要過(guò)量使用,因?yàn)閮?nèi)存有限,能保存路徑地址的就不要存放圖片數(shù)據(jù),不經(jīng)常使用的盡量不要緩存,不用時(shí)就清空。

7.盡量使用Android 自己一套的機(jī)制,因?yàn)閍ndroid是基于Dalvik而非JVM。

 InputStream is = null;
         try {
         is = new FileInputStream(new File(picstr));
   
         } catch (FileNotFoundException e) {
        // http://www.cnblogs.com/tankaixiong/
        // }
下面這個(gè)方法肯定優(yōu)于上面這個(gè)方法。
 Resources re = mContext.getResources();
         InputStream is = re.openRawResource(picstr);

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)