測試機型:三星S3 臺版 1GB Ram。和魅藍有點近。本文轉自其它論壇,為什么要轉呢?因為我的下一個魅藍優化教程要用到這里面的東西。各位魅友可以先來學習下。
在system/build.prop,原始三星S3的Dalvik虛擬機設定是這樣子的:
1.dalvik.vm.heapstartsize=8m(表示應用程序啟動后為其分配的初始大小為8m)
這里分配的內存容量會影響到整個系統對RAM的使用程度,和第一次使用應用程序時的流暢程序。
這個值越大,系統消耗RAM則越快,但是應用程序打開后的反應也越快。
值越小,系統的RAM剩余則越多,但是程序在啟動后會比較慢。
2.dalvik.vm.heapgrowthlimit=64m(每個應用程序最大內存可分配到64m)
超過就會崩潰,退出該app...我猜沒錯的話
3.dalvik.vm.heapsize=256m(單個虛擬機可分配的最大內存256m)
這里分配的內存容量會影響到整個系統對RAM的使用程序,和程序在運行一段時間后的反應速度。這個值越大,系統消耗RAM則越快,但是程序會運行的非常穩 定,尤其是游戲和視頻程序的內容加載速度可以大幅度提升。值越小,系統的RAM剩余則越多,但是程序會很卡,尤其是游戲在切換場景Loading的時候會 花費很多的時間。若應用程序需要使用超過這個值的內存時,將會觸發系統的垃圾收集器,系統和程序就會卡頓。
用上面設定的話
每開啟一只app,系統就會劃出8m的動態內存給該程式使用,超過的部分會再+8m
共可以+7次8m,包含一開始劃出的8m,總共64m,這是單一只程式的最大動態內存使用量
超過的話,該程式就會崩潰(自動結束掉)
單個虛擬機可分配的最大內存256m,意思是可以裝滿64m內存的程式X4
超過的部分就會對虛擬機內的程式強制回收內存,一方面要先強制關掉一些程式,一方面要加載程式劃分新的內存,這時候就會出現卡卡卡、頓頓頓
因為每個人使用習慣不同,有時愛裝一堆widget(小工具)在桌面上,單單擺在桌面上也不常使用他
也許單一widget只要3-5m,如果今天一開始就劃分8m內存給他,對于一個常駐不到5M的程式
,就多浪費3M的內存,一般原廠rom閑置程序+后臺程序就約30個,每個都浪費約3M內存
就將近浪費90M
所以我們可以將
1.dalvik.vm.heapstartsize=8m,改為=4M后重開機
光待機其況下你就會發現使用中內存變少了,可用內存變多了,雖然你在使用桌面小工具時候
可能不會比當初還要順,因為系統還在幫該程式劃分新的內存空間,但也不至于頓
2.dalvik.vm.heapgrowthlimit=64m不用改,現在的app在前景中都吃很大內存
若改小成32m,那假設程序內存要吃到40m才會夠用,該程式可能就當給你看
3..dalvik.vm.heapsize=256m(單個虛擬機可分配的最大內存256m),雖然是寫單個虛擬機,但系統到底會產生多少個虛擬機...我不確定,但唯一確定是不超過實際ram的可用量
記得S3雖然是配1G RAM,但實際上看到好像是780M吧(其他好像是GPU用掉了)
780/256=3...,大概就是3個虛擬機左右(應該是這樣)
想要看到更多ram的人可以將256改為128m,重開機后...你會發現可用內存又變多了...
但一樣,開啟新程式時候要再+128劃分新的虛擬機,速度可能慢一些,但不會頓,又可節省內存的不必要浪費
以上是犧牲一些開啟速度,但可以減緩被系統強制回收內存的頓挫感
小弟我第一次打這么大篇瞎掰文,各位當作參考就好不要完全相信
關于root后修改build.prop當掉、死機、變磚,請不要晚上來找我~謝謝
懶人總結 S3 臺版
1.想要裝很多widget小工具到桌面的,推薦
dalvik.vm.heapstartsize=5m
dalvik.vm.heapgrowthlimit=40m
dalvik.vm.heapsize=160m
也許開啟程式沒那么快,但比較不卡頓,且可用內存會比較多
2.只要玩游戲、桌面很干凈很無聊的、不安裝其他widget小工具
dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=384m
加載大型程式或游戲比較快,缺點是可用內存會比較小
S3 LTE (I9305)默認dalvik也是跟S3一樣
但是可以改成(我也是這樣設定)
dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=576m(1750/576=3...)可以做出3個虛擬機。
(576/8)在8M以下的程式可以有72只閑置程式
(576/64)一個虛擬機可以容納9只多工作。
//最后附上本人魅藍使用的參數,回帖可見。
dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=80m
dalvik.vm.heapsize=320m
dalvik.vm.heaptargetutilization=0.84
dalvik.vm.heapminfree=1m
dalvik.vm.heapmaxfree=8m
最后科普下:
dalvik.vm.heapstartsize
堆分配的初始大小,調整這個值會影響到應用的流暢性和整體ram消耗。這個值越小,系統ram消耗越慢,但是由于初始值較小,一些較大的應用需要擴張這個堆,從而引發gc和堆調整的策略,會應用反應更慢。相反,這個值越大系統ram消耗越快,但是程序更流暢。
dalvik.vm.heapgrowthlimit
極限堆大小,dvm heap是可增長的,但是正常情況下dvm heap的大小是不會超過dalvik.vm.heapgrowthlimit的值。如果受控的應用dvm heap size超過該值,則將引發oom。
dalvik.vm.heapsize
使用大堆時,極限堆大小。一旦dalvik heap size超過這個值,直接引發oom。在android開發中,如果要使用大堆,需要在manifest中指定android:largeHeap為true。這樣dvm heap最大可達dalvik.vm.heapsize。
[dalvik.vm.heaptargetutilization]: [0.75] 可以設定內存利用率的百分比,當實際的利用率偏離這個百分比的時候,虛擬機會在GC的時候調整堆內存大小,讓實際占用率向個百分比靠攏。
上面的幾個參數是與虛擬機的內存分配相關的,虛擬機的內存分配過程是下面這樣的:
1 首先判斷一下需要申請的size是不是過大,如果申請的size超過了堆的最大限制,則轉入步驟6
2 嘗試分配,如果成功則返回,失敗則轉入步驟3
3 判斷是否gc正在進行垃圾回收,如果正在進行則等待回收完成之后,嘗試分配。如果成功則返回,失敗則轉入步驟4
4 自己啟動gc進行垃圾回收,這里gcForMalloc的參數是false。所以不會回收軟引用,回收完成后嘗試分配,如果成功則返回,失敗則轉入步驟5
5 調用dvmHeapSourceAllocAndGrow嘗試分配,這個函數會擴張堆。所以heap startup的時候可以給一個比較小的初始堆,實在不夠用再調用它進行擴張
6 進入回收軟引用階段,這里gcForMalloc的參數是ture,所以需要回收軟引用。然后調用dvmHeapSourceAllocAndGrow嘗試分配,如果失敗則拋出OOM。
好了,教程到這里結束了,如果你堅持看完了,你早晚會成為大神的:D。