2017年8月21日 星期一

Heap and Stack 舉例圖解


心得:
1. 先理解 value type, and reference type,
2. stack 存放變數, 實際的 value
     當new  一個東西時,是在stack 存放位置   指向到  heap 真正資料的位置

以下我用簡單的程式來講解資料儲存實際上是如何運作。
1
2
3
int a = 123;
long b = 456L;
User c = new User("Mark", Gender.MALE);
以上程式碼的資料儲存順序大致上可以視為以下流程圖 (在此先不考慮 Constant Pool)
exampleexample
前兩行指令都是 Primitive Type,會在 Stack 內建立變數 a 和 b,並將實際值 123 和 456L 存放於變數內。
第三行指令要切分成兩個部份,等號右邊及左邊,首先是右邊的部份,先以 name 和 gender參數創建一個 User 實例,此時會在 Heap 中的一個位址 (ex. 0x1234) 存放實例的屬性資料 (ex. namegenderaddress…),並將實例所在的記憶體位址 (0x1234) 指定給變數 c 參考。
這篇是以變數為例子去比較兩者儲存方式的不同,至於「Stack 如何儲存函式」、「常數池 (Constant Pool) 是什麼」、「實例的 method 存放在哪」等等問題,留待後面文章再做解答。
從以上的例子可以發現,Stack 內的變數值分為兩種類型,一種為 Value Type 實質類別 ,儲存的是 實際的值 (ex. 123456L);另一種為 Reference Type 參考類別,儲存的是 資料在 Heap 中的記憶體位址 (ex. 0x1234)。

沒有留言:

張貼留言