Android 查看每個應用的最大可用記憶體

來源:互聯網
上載者:User

標籤: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 查看每個應用的最大可用記憶體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.