android程序運行時出現OutOfMemoryError


先上乾貨:

android程序運行時出現OOMOutOfMemoryError),即內存泄露,說明程序的內存管理出現問題,或者系統給程序分配的內存太低。如果程序難以優化,就可以修改系統分配給程序的內存值。這個值叫dalvik.vm.heapsize,在/system/build.prop文件裏,大小一般是32m48m,可以改成64m或以上。寫到 /system/build.prop 後重新開機纔會生效。記得chmod 644 /system/build.prop ,不然會沒辦法開機。

關於build.prop:

Android系統中有一個類似Windows系統註冊表的文件build.prop。這個文件內定義了系統初始(或永久)的一些參數屬性、功能的開放等。通過調整/增加參數可以達到較調系統性能偏重點和附加功能開啓的作用。在Android 2.22.34.04.14.24.34.4中雖然每一版都有自己獨有的參數,但絕大部分都是通用的,且可以起到關鍵性作用的。

關於dalvikvm:

Dalvik虛擬機是Android程序的虛擬機,是AndroidJava程序的運行基礎。其指令集基於寄存器架構,執行其特有的文件格式——dex字節碼來完成對象生命週期管理、堆棧管理、線程管理、安全異常管理、垃圾回收等重要功能。它的核心內容是實現庫(libdvm.so),大體由C語言實現。依賴於Linux內核的一部分功能——線程機制、內存管理機制,能高效使用內存,並在低速CPU上表現出的高性能。每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機實例,其代碼在虛擬機的解釋下得以執行。

一個應用,一個虛擬機實例,一個進程!!!

每一個Android應用都運行在一個Dalvik虛擬機實例裏,而每一個虛擬機實例都是一個獨立的進程空間。每個進程之間可以通信(IPCBinder機制實現)。虛擬機的線程機制,內存分配和管理,Mutex等等都是依賴底層操作系統而實現的。

 不同的應用在不同的進程空間裏運行,當一個虛擬機關閉或意外中止時不會對其它 虛擬機造成影響,可以最大程度的保護應用的安全和獨立運行。

關於dalvik堆內存分配

-dalvik.vm.heapstartsize           

堆分配的初始大小,調整這個值會影響到應用的流暢性和整體ram消耗。這個值越小,系統ram消耗越慢,但是由於初始值較小,一些較大的應用需要擴張這個堆,從而引發gc和堆調整的策略,會應用反應更慢。相反,這個值越大系統ram消耗越快,但是程序更流暢。

-dalvik.vm.heapgrowthlimit      

受控情況下的極限堆(僅僅針對dalvik堆,不包括native堆)大小,dvm heap是可增長的,但是正常情況下dvm heap的大小是不會超過dalvik.vm.heapgrowthlimit的值(非正常情況下面會詳細說明)。這個值控制那些受控應用的極限堆大小,如果受控的應用dvm heap size超過該值,則將引發oomout 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:largeHeaptrue。這樣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

http://wenku.baidu.com/view/6811c82fcfc789eb172dc812.html

http://blog.csdn.net/andyxm/article/details/6126907

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章