Android記憶體管理原則的最佳化

來源:互聯網
上載者:User

Android記憶體管理原則的最佳化

一、Android記憶體管理原則

1.Backing Swap (優先執行Compcache,不能滿足要求時再啟用SWAP)
2.Compcache (壓縮緩衝,消耗CPU效能,比較費電)
3.Swap (傳統LINUX的SWAP,加速SWAP所在介質的損耗)
4.lowmemorykiller (低記憶體殺手)

如啟用Backing Swap策略,則同時啟用Compcache和SWAP,並優先使用Compcache後再用SWAP,最後再執行lowmemorykiller策略。
如不開啟Backing Swap策略,Compcache策略和SWAP策略只能二選一,最後再執行lowmemorykiller策略。
即使不啟用前三種管理原則,lowmemorykiller策略作為android系統預設的記憶體管理原則,也始終是開啟的。

二,關於Compcache

Compcache是指對記憶體進行壓縮,可以在“設定”-“CM設定”-“效能”-“使用壓縮緩衝”中設定。如果開啟SWAP,這個值是“禁用”,沒啟用SWAP或Backing Swap,則預設18%,啟用的話可以省出一些可用記憶體,但壓縮解壓過程會加大CPU的工作量,如果CPU效能不夠強,反而會影響系統的流暢性,同時增加電量的消耗,所以,Compcache也要按實際需要設定,辯證對待。如果記憶體足夠大,不推薦開啟,CPU效能不夠強,也不推薦開啟。

三、關於SWAP

SWAP是一種LINUX下的基於記憶體分頁的交換分區,類似虛擬記憶體技術,作為實體記憶體不足時的擴充補充,但並不等於是實體記憶體的直接增量。

使用條件:

1.支援SWAP的核心
2.含有busybox

推薦使用CM的Android的原版和衍生版。

為了方便使用,可根據下面代碼說明,製作CreatIMG.sh和90userinit這兩個指令檔,這兩個檔案都是標準的文字格式設定內容,可參照下面代碼用文字編輯器錄入編輯。

1.CreatIMG.sh檔案是用來在指定位置上產生指定大小的IMG鏡像。

mount -o remount,rw /system;       //載入system分區
swapoff /dev/block/loop7;
dd if=/dev/zero of=/system/swap.img  bs=1024 count=65536;       //建立swap.img 檔案,檔案大小為count=65536,即64M

2.90userinit檔案是讓開機就自動運行掛載SWAP.IMG鏡像並啟用SWAP指令碼。

mount -o remount,rw /system;         //載入system分區
losetup /dev/block/loop7 /system/swap.img ;      //將swapfile檔案虛擬成裝置分區loop7.
mkswap /dev/block/loop7;        //將裝置分區loop7建立為交換區
swapon /dev/block/loop7;        //啟用交換分區

上面代碼中/system目錄和swap.img檔案名稱是可以自訂的,支援手機內建快閃記憶體任意位置,也支援外置快閃記憶體SD、TF卡任意位置,甚至是TF卡裡的EXT分區。例如手機內建快閃記憶體的/data目錄下(這也就是使用者軟體安裝的目錄),或是手機內建快閃記憶體/system目錄(也就是系統目錄)。

使用方法:

1.把CreatIMG.sh檔案複製到手機裡(/system或/data都可以,但不能是/sdcard)。
2.點擊CreatIMG.sh檔案,選擇“執行”。
  目的:在system目錄下產生IMG檔案。
  注意:RE瀏覽器要重新開啟system目錄,才能看到是否已產生IMG檔案。如果產生成功,可刪除CreatIMG.sh。
4.把90userinit檔案複製到/system/etc/init.d/目錄下,更改許可權為可執行rwxr-x---。
  目的:開機自動掛載IMG檔案用於SWAP。
5.重啟,再開啟超級終端輸入 free 命令查看是否SWAP已載入成功,如果看swap那一行不全是0,且是你指定的容量(數字是以KB為單位),則說明正確啟用SWAP。

四、關於swappiness

含義:當可用記憶體不足時,會啟用swap,swappiness是決定SWAP使用頻率的參數,這個值儲存在/proc/sys/vm/swappiness檔案裡!

查看的命令:

cat /proc/sys/vm/swappiness

顯示結果是一個整數。

修改的命令:

su       //進入管理員模式

sysctl -w vm.swappiness=60

或者

su      //進入管理員模式

echo 60 > /proc/sys/vm/swappiness

CM的android 2.3預設值是60,這個值越小意味著系統對swap的使用頻率就越低,即會儘可能使用你的實體記憶體。當然,這個設定要辯證使用,當實體記憶體足夠多時,你可以把它設定儘可能設定為小一點的值,如10(甚至為0,但不會禁用SWAP),使系統盡量少用SWAP,且盡量使用實體記憶體,這將會帶來一定的效能提升;同樣,如果實體記憶體比較小,這個值設定過小了會讓SWAP起不到應有的作用,反而影響效能。

五、關於lowmemorykiller

含義:當Android系統判斷當前已經沒有足夠的記憶體來運行新的進程,需要關閉一些雖然開著卻沒怎麼使用的進程來釋放可用記憶體,這時就根據ActivityManagerService.java記錄著每一個進程的優先順序,去查殺低優先順序的程式。查殺規則儲存在/sys/module/lowmemorykiller/parameters/minfree!

顯示的命令:

cat /sys/module/lowmemorykiller/parameters/minfree

顯示出的應該是6個整數,例如CM的android 2.3預設值是2048,3072,4096,6144,7168,8192,分別逗號隔著。這些整數的單位是page,因為1 page = 4 kilobyte (1 Page = 4 KB),也就是256 page = 1 MB,假如你要設定64MB,那64*256=16384 page。6個數字分別從左至右對應前景程式(FOREGROUND_APP)、可見應用(VISIBLE_APP)、次要服務(SECONDARY_SERVER)、隱藏應用(HIDDEN_APP)、內容供應商(CONTENT_PROVIDER)、空置應用(EMPTY_APP)這6類進程的記憶體警戒值,當可用記憶體少於某警戒值時,系統會lowmemorykiller殺死該特定值對應的那一類進程。一般前三個值保持預設即可,主要修改後面三個值,推薦為“*,*,*,8448,8192,16384”,當然,這幾個值也要辯證對待,看你最常使用的軟體類型作出調整。

修改的命令:

su      //進入管理員模式

echo "1536,2048,4096,8448,8192,16384" > /sys/module/lowmemorykiller/parameters/minfree

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.