標籤:ini article systems context 查看 機器 超出 執行 load
http://blog.csdn.net/vshuang/article/details/39647167 Android 記憶體管理 &Memory Leak & OOM 分析
單個應用可用的最大記憶體
Android裝置出廠以後,java虛擬機器對單個應用的最大記憶體配置就確定下來了,超出這個值就會OOM。這個屬性值是定義在/system/build.prop檔案中的
dalvik.vm.heapstartsize=8m
它表示堆分配的初始大小,它會影響到整個系統對RAM的使用程度,和第一次使用應用時的流暢程度。
它值越小,系統ram消耗越慢,但一些較大應用一開始不夠用,需要調用gc和堆調整策略,導致應用反應較慢。它值越大,這個值越大系統ram消耗越快,但是應用更流暢。
dalvik.vm.heapgrowthlimit=64m // 單個應用可用最大記憶體
主要對應的是這個值,它表示單個進程記憶體被限定在64m,即程式運行過程中實際只能使用64m記憶體,超出就會報OOM。(僅僅針對dalvik堆,不包括native堆)
dalvik.vm.heapsize=384m//heapsize參數表示單個進程可用的最大記憶體,但如果存在heapgrowthlimit參數,則以heapgrowthlimit為準.
heapsize表示不受控情況下的極限堆,表示單個虛擬機器或單個進程可用的最大記憶體。而android上的應用是帶有獨立虛擬機器的,也就是每開一個應用就會開啟一個獨立的虛擬機器(這樣設計就會在單個程式崩潰的情況下不會導致整個系統的崩潰)。
注意:在設定了heapgrowthlimit的情況下,單個進程可用最大記憶體為heapgrowthlimit值。在android開發中,如果要使用大堆,需要在manifest中指定android:largeHeap為true,這樣dvm heap最大可達heapsize。
不同裝置,這些個值可以不一樣。一般地,廠家針對裝置的配置情況都會適當的修改/system/build.prop檔案來調高這個值。隨著裝置硬體效能的不斷提升,從最早的16M限制(G1手機)到後來的24m,32m,64m等,都遵循Android架構對每個應用的最小記憶體大小限制,參考http://source.android.com/compatibility/downloads.html 3.7節。
通過代碼查看每個進程可用的最大記憶體,即heapgrowthlimit值:
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int memClass = activityManager.getMemoryClass();//64,以m為單位
或:
$adb shell getprop dalvik.vm.heapgrowthlimit
192m
$adb shell getprop dalvik.vm.heapsize
512m
$adb shell getprop dalvik.vm.heapstartsize
16m
http://hukai.me/android-training-managing_your_app_memory/ Android Training - 管理應用的記憶體
檢查你應該使用多少的記憶體
正如前面提到的,每一個Android裝置都會有不同的RAM總大小與可用空間,因此不同裝置為app提供了不同大小的heap限制。你可以通過調用getMemoryClass())來擷取你的app的可用heap大小。如果你的app嘗試申請更多的記憶體,會出現OutOfMemory的錯誤。
在一些特殊的情景下,你可以通過在manifest的application標籤下添加largeHeap=true的屬性來聲明一個更大的heap空間。如果你這樣做,你可以通過getLargeMemoryClass())來擷取到一個更大的heap size。
然而,能夠擷取更大heap的設計本意是為了一小部分會消耗大量RAM的應用(例如一個大圖片的編輯應用)。不要輕易的因為你需要使用大量的記憶體而去請求一個大的heap size。只有當你清楚的知道哪裡會使用大量的記憶體並且為什麼這些記憶體必須被保留時才去使用large heap. 因此請盡量少使用large heap。使用額外的記憶體會影響系統整體的使用者體驗,並且會使得GC的每次已耗用時間更長。在任務切換時,系統的效能會變得大打折扣。
另外, large heap並不一定能夠擷取到更大的heap。在某些有嚴格限制的機器上,large heap的大小和通常的heap size是一樣的。因此即使你申請了large heap,你還是應該通過執行getMemoryClass()來檢查實際擷取到的heap大小。
Android 查看每個應用的最大可用記憶體