Android記憶體機制 堆和棧

2021-07-26 05:53:55 字數 823 閱讀 1716

1.dalvik的heap(堆)和stack(棧)

2.物件例項資料

實際上是儲存物件例項的屬性,屬性的型別和物件本身的型別標記等,但是不儲存例項的方法。例項的方法是屬於資料指令,是儲存在stack裡面,也就是上面**裡面的類方法。

物件例項在heap中分配好以後,會在stack中儲存乙個4位元組的heap記憶體位址,用來查詢物件的例項。因為在stack裡面會用到heap的例項,特別是呼叫例項的時候需要傳入乙個this指標。

4、非靜態方法和靜態方法

非靜態方法有乙個隱含的傳入引數,這個引數是dalvik虛擬機器傳進去的,這個隱含引數就是物件例項在stack中的位址指標。因此非靜態方法(在stack中的指令**)總是可以找到自己的專用資料(在heap 中的物件屬性值)。當然非靜態方法也必須獲得該隱含引數,因此非靜態方法在呼叫前,必須先new乙個物件例項,獲得stack中的位址指標,否則dalvik虛擬機器將無法將隱含引數傳給非靜態方法。

靜態方法沒有隱含引數,因此也不需要new物件,只要class檔案被classloader load進入jvm的stack,該靜態方法即可被呼叫。所以我們可以直接使用類名呼叫類的方法。當然此時靜態方法是訪問不到heap 中的物件屬性的。

5、靜態屬性和動態屬性

靜態屬性是儲存在stack中的,而不同於動態屬性儲存在heap 中。正因為都是在stack中,而stack中指令和資料都是定長的,因此很容易算出偏移量,所以類方法(靜態和非靜態)都可以訪問到類的靜態屬性。也正因為靜態屬性被儲存在stack中,所以具有了全域性屬性。

堆記憶體和棧記憶體

堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...

堆記憶體和棧記憶體

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式 類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放 若程式設計師不釋放,程式結束時可能由 os 注意它與資...

棧記憶體和堆記憶體

在平時寫 的時候經常遇到一些很簡單但是自己卻不太理解的問題,於是整理了一下。記憶體 一般情況下我們分為棧記憶體和堆記憶體。下面我們來說說它們的區別。一 棧記憶體 用於儲存區域性變數,當資料用完的時候,它所占用的空間會自動釋放。public class demo1 return j i 這裡的 i j...