1. 程式人生 > >Android 記憶體的一些小知識點

Android 記憶體的一些小知識點

首先了解一下堆(Heap)和棧(Stack)

  百度百科:在計算機領域中,堆疊是一個不容忽視的概念,堆疊都是一種資料項按序排列的資料結構,只能在一端對資料項進行插入和刪除。要點:,佇列優先,先進先出(FIFO);,後進先出(FILO)。
    
  Stack空間(進棧和出棧)由作業系統控制,主要儲存函式地址、函式引數、區域性變數等等,所以Stack空間不需要很大。


  Heap空間由程式控制,程式設計師可以操作這片地址空間。Heap為程式完成各種複雜任務提供記憶體空間,所以空間比較大。正是因為Heap空間由程式設計師管理,所以容易出現使用不當導致嚴重問題。


Android裡的Native記憶體和Dalvik記憶體

  Android裡的程序一般有兩種:native程序(採用C/C++實現)和java程序(Android中運行於dalvik虛擬機器上的程序)。dalvik虛擬機器的宿主程序由fork()系統呼叫建立,所以每一個java程序都是存在於一個native程序中。


  dalvik記憶體:是指dalvik虛擬機器所使用的記憶體。
  native記憶體:是被native使用的記憶體。應該指使用C\C++分配的記憶體。


  我們一般只需要關心Android中程序的堆(Heap)記憶體。因為上面已經提過,heap空間才是完全由我們程式設計師控制的的,我們使用的malloc、C++ new和java new所申請的空間都是heap空間, C/C++申請的記憶體空間在native heap中,而java申請的記憶體空間則在dalvik heap中。


  這裡我們用一張圖大致看一下我們實際開發中申請的資料的存放位置:
這裡寫圖片描述


  不過需要注意的是:雖然Bitmap物件是使用java native方法建立的,但是其實它會被分配到dalvik heap中,所以過多地建立bitmap物件會導致OOM異常,這是因為Android系統對dalvik的vm heapsize做了硬性限制,當java程序申請的java空間超過閾值時,就會丟擲OOM異常(這個閾值可以是48M、24M、16M等,視機型而定)。


參考:

  1. 淺談Android記憶體管理