進程的地址空間為0到4GB,示意圖如下:
Stack空間(進棧和出棧)由操作系統控制,其中主要存儲函數地址、函數參數、局部變量等等,所以Stack空間不需要很大,一般為幾MB大小。
Heap空間的使用由程序員控制,程序員可以使用malloc、new、free、delete等函數調用來操作這片地址空間。Heap為程序完成各種復雜任務提供內存空間,所以空間比較大,一般為幾百MB到幾GB。
Android中的進程:
(1) native進程:采用C/C++實現,不包含dalvik實例的linux進程,/system/bin/目錄下面的程序文件運行后都是以native進程形式存在的。/system/bin/surfaceflinger、/system/bin/rild、procrank等就是native進程。
(2) java進程:實例化了dalvik虛擬機實例的linux進程,進程的入口main函數為java函數。dalvik虛擬機實例的宿主進程是fork()系統調用創建的linux進程,所以每一個android上的java進程實際上就是一個linux進程,只是進程中多了一個dalvik虛擬機實例。因此,java進程的內存分配比native進程復雜。如圖3,Android系統中的應用程序基本都是java進程,如Launcher、InCallUI、Contact、SystemUI等等。
Java process的結構:
VSS- Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
RSS- Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
PSS- Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存)
USS- Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)
一般來說內存占用大小有如下規律:VSS >= RSS >= PSS >= USS
注意:dumpsys meminfo可以查看native進程和java進程,而procrank只能查看java進程。
PSS(Proportional Set Size),表示進程實際使用的物理內存,是由私有內存加上按比例分擔計算的各進程共享內存得到的值。例如,如果有三個進程都使用了一個消耗30K內存的so庫,那么每個進程在計算這部分PSS值的時候,只會計算10K??偟挠嬎愎绞牵?br/>Dalvik PSS內存 = 私有內存Private Dirty + (共享內存Shared Dirty / 共享的進程數)
從實際含義來講,Private Dirty部分存放的是應用new出來的對象實例,是每個應用所獨有的,不會再共享。Shared Dirty部分主要是zygote加載的Android框架部分,會被所有Android應用進程共享。通常進程數的值在10-50的范圍內。
PSS是一個非常有用的數值,如果系統中所有的進程的PSS相加,所得和即為系統占用內存的總和。但要注意的是,進程的PSS并不代表進程結束后系統能夠回收的內存大小。
1、 Native Heap
mallinfo是一個C庫, mallinfo函數提供了各種各樣的通過C的malloc()函數分配的內存的統計信息。
Naitve Heap Size: 從mallinfo usmblks獲得,代表最大總共分配空間
Native Heap Alloc: 從mallinfo uorblks獲得,總共分配空間
Native Heap Free: 從mallinfo fordblks獲得,代表總共剩余空間
Native Heap Size 約等于Native Heap Alloc + Native Heap Free
native heap的增長并不受dalvik vm heapsize的限制。只要RAM有剩余空間,可以一直在native heap上申請空間。
2、 Dalvik Heap
和Java Heap概念相同,指java代碼申請的內存。統計/dev/ashmem/dalvik-heap和/dev/ashmem/dalvik-zygote占用內存。
3、 Dalvik Other
其它以/dev/ashmem/dalvik-開頭的內存區域歸為Dalvik Other。
4、 Stack
由操作系統控制,其中主要存儲函數地址、函數參數、局部變量等等,所以Stack空間不需要很大,一般為幾MB大小。
5、 Ashmem
Ashmem對應所有/dev/ashmem/下不以dalvik-開頭的內存區域
6、 Other dev
Other dev對應的是以/dev下其他的內存區域。
7、 mmap
文件的mmap按已知的幾個擴展名分類,其余的歸為other mmap。分為.so mmap, .apk mmap, .ttf mmap, .dex mmap, .oat mmap, .art mmap, other mmap. 應用的dex會占據較大的空間,并且隨著代碼增加使得dex文件變大,占用的內存也會增加。減小dex的(相當于減少代碼)尺寸能夠降低這部分內存占用,同時也會減少dalvik部分的內存。
8、 GL mtrack
GL mtrack is driver-reported GL memory usage. It's primarily the sum of GL texture sizes, GL command buffers, fixed global driver RAM overheads, etc.
GL mtrack是驅動程序報告GL內存使用情況。主要是GL texture大小、GL命令緩沖區、固定全局驅動器RAM開銷等的總和。
9、 Unknown
Unknown
內存分析工具-showmap
1|root@mangosteen:/ # ps | grep videomeeting
u0_a60 7853 1708 1924376 134956 SySepoll 7fa364781c S com.xxxxxx.xxxx.videomeeting
root@mangosteen:/ # showmap -a 7853
顯示內容很多,以下僅列舉占用PSS較大的幾項:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。