Android app 內存分配

在Android app的開發過程中,我們經常會遇到內存泄漏的異常,那麼搞清楚每個應用程序在Android系統中最多可分配多少內存空間是十分重要的

1、APP默認分配內存大小

google原生OS的默認值是16M,但是各個廠家定製自己的OS時,會對這個值進行修改.
google 原生OS:

gDvm.heapSizeStart = 2 * 1024 * 1024; // heap初始化大小爲2M
gDvm.heapSizeMax = 16 * 1024 * 1024; // 最大的heap爲16M

運行如下代碼:

Runtime runtime =Runtime.getRuntime();
long maxMemory=runtime .maxMemory();
log. ("maxMemory:",Long.toString(maxMemory/(1024*1024)));

可以直接計算出當前app的最大獲取內存。
實測三星s7(Android 6.0.1)、三星S6edg(Android 6.0.1):
(1)未設定屬性android:largeheap = “true”時,可以申請到的最大內存空間爲256M。
(2)設定屬性android:largeheap = “true”時, 可以申請的最大內存空間爲512M,是原來的兩倍。
三星S4(android 4.3)(android 5.0):
(1)未設定屬性android:largeheap = “true”時,可以申請到的最大內存空間爲128M。
(2)設定屬性android:largeheap = “true”時, 可以申請的最大內存空間爲512M。
可見實際的app的最大內存和手機的硬件設備有關。

  

2、Android的GC如何回收內存

Android的一個應用程序的內存泄露對別的應用程序影響不大。爲了能夠使得Android應用程序安全且快速的運行,Android的每個應用程序都會使用一個專有的Dalvik虛擬機實例來運行,它是由Zygote服務進程孵化出來的,也就是說每個應用程序都是在屬於自己的進程中運行的。Android爲不同類型的進程分配了不同的內存使用上限,如果程序在運行過程中出現了內存泄漏的而造成應用進程使用的內存超過了這個上限,則會被系統視爲內存泄漏,從而被kill掉,這使得僅僅自己的進程被kill掉,而不會影響其他進程(如果是system_process等系統進程出問題的話,則會引起系統重啓)。

3、查看應用內存使用情況

  下面我們看看如何在開發過程中查看我們程序運行時內存使用情況。我們可以通過ADB的一個命令查看:
  
//$package_name:應用包名
//$pid:應用進程ID,可以用PS命令查看:關於ps命令查看PID

  adb shell dumpsys meminfo $package_name or $pid

注* 命令中“$”需要去掉,具體見下圖:
adb shell 命令結果

Naitve Heap Size: 從mallinfo usmblks獲得,代表最大總共分配空間

Native Heap Alloc: 從mallinfo uorblks獲得,總共分配空間

Native Heap Free: 從mallinfo fordblks獲得,代表總共剩餘空間

Native Heap Size 約等於Native Heap Alloc + Native Heap Free

mallinfo是一個C庫, mallinfo 函數提供了各種各樣的通過C的malloc()函數分配的內存的統計信息。

Dalvik Heap Size:從Runtime totalMemory()獲得,Dalvik Heap總共的內存大小。

Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的內存大小。

Dalvik Heap Free:從Runtime freeMemory()獲得,Dalvik Heap剩餘的內存大小。

Dalvik Heap Size 約等於Dalvik Heap Alloc + Dalvik Heap Free

OtherPss, include Cursor,Ashmem, Other Dev, .so mmap, .jar mmap, .apk mmap, .ttf mmap, .dex mmap, Other mmap, Unkown統計信息都可以在process的smap文件看到。

Objects and SQL 信息都是從Android Debug信息中獲得。

其他類型 smap 路徑名稱 描述

Cursor /dev/ashmem/Cursor Cursor消耗的內存(KB)

Ashmem /dev/ashmem 匿名共享內存用來提供共享內存通過分配一個多個進程

可以共享的帶名稱的內存塊

Other dev /dev/ 內部driver佔用的在 “Other dev”

.so mmap .so C 庫代碼佔用的內存

.jar mmap .jar Java 文件代碼佔用的內存

.apk mmap .apk apk代碼佔用的內存

.ttf mmap .ttf ttf 文件代碼佔用的內存

.dex mmap .dex Dex 文件代碼佔用的內存

Other mmap 其他文件佔用的內存

圖中各項的具體含義見這裏


如有疑問歡迎大家留言指正。祝大家生活愉快。

最後歡迎對Android開發感興趣的老哥一起討論。



  

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