先上乾貨:
android程序運行時出現OOM(OutOfMemoryError),即內存泄露,說明程序的內存管理出現問題,或者系統給程序分配的內存太低。如果程序難以優化,就可以修改系統分配給程序的內存值。這個值叫dalvik.vm.heapsize,在/system/build.prop文件裏,大小一般是32m或48m,可以改成64m或以上。寫到 /system/build.prop 後重新開機纔會生效。記得chmod 644 /system/build.prop ,不然會沒辦法開機。
關於build.prop:
在Android系統中有一個類似Windows系統註冊表的文件build.prop。這個文件內定義了系統初始(或永久)的一些參數屬性、功能的開放等。通過調整/增加參數可以達到較調系統性能偏重點和附加功能開啓的作用。在Android 2.2、2.3、4.0、4.1、4.2、4.3、4.4中雖然每一版都有自己獨有的參數,但絕大部分都是通用的,且可以起到關鍵性作用的。
關於dalvikvm:
Dalvik虛擬機是Android程序的虛擬機,是Android中Java程序的運行基礎。其指令集基於寄存器架構,執行其特有的文件格式——dex字節碼來完成對象生命週期管理、堆棧管理、線程管理、安全異常管理、垃圾回收等重要功能。它的核心內容是實現庫(libdvm.so),大體由C語言實現。依賴於Linux內核的一部分功能——線程機制、內存管理機制,能高效使用內存,並在低速CPU上表現出的高性能。每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。
一個應用,一個虛擬機實例,一個進程!!!
每一個Android應用都運行在一個Dalvik虛擬機實例裏,而每一個虛擬機實例都是一個獨立的進程空間。每個進程之間可以通信(IPC,Binder機制實現)。虛擬機的線程機制,內存分配和管理,Mutex等等都是依賴底層操作系統而實現的。
不同的應用在不同的進程空間裏運行,當一個虛擬機關閉或意外中止時不會對其它 虛擬機造成影響,可以最大程度的保護應用的安全和獨立運行。
關於dalvik堆內存分配
-dalvik.vm.heapstartsize
堆分配的初始大小,調整這個值會影響到應用的流暢性和整體ram消耗。這個值越小,系統ram消耗越慢,但是由於初始值較小,一些較大的應用需要擴張這個堆,從而引發gc和堆調整的策略,會應用反應更慢。相反,這個值越大系統ram消耗越快,但是程序更流暢。
-dalvik.vm.heapgrowthlimit
受控情況下的極限堆(僅僅針對dalvik堆,不包括native堆)大小,dvm heap是可增長的,但是正常情況下dvm heap的大小是不會超過dalvik.vm.heapgrowthlimit的值(非正常情況下面會詳細說明)。這個值控制那些受控應用的極限堆大小,如果受控的應用dvm heap size超過該值,則將引發oom(out of memory)。
-dalvik.vm.heapsize
不受控情況下的極限堆大小,這個就是堆的最大值。不管它是不是受控的。這個值會影響非受控應用的dalvikheap size。一旦dalvik heap size超過這個值,直接引發oom。
用他們三者之間的關係做一個簡單的比喻:分配dalvik heap就好像去食堂打飯,有人飯量大,要喫三碗,有人飯量小,連一碗都喫不完。食堂的策略是先打一碗,湊合喫,不夠了自己再來加,一般人最多加到三碗。虎背熊腰的大漢可以加到五碗。超過五碗誰也不給了(食堂可能會破產)。
開始給一碗 對應dalvik.vm.heapstartsize
一般人可以加到三碗 對應dalvik.vm.heapgrowthlimit
虎背熊腰的大漢最多能喫五碗 對應dalvik.vm.heapsize
在android開發中,如果要使用大堆。需要在manifest中指定android:largeHeap爲true。這樣dvm heap最大可達dalvik.vm.heapsize。
Reference
http://bbs.meizu.cn/thread-3529493-1-1.html
http://my.eoe.cn/10407/archive/3856.html
http://blog.csdn.net/cqupt_chen/article/details/11068129