跳到主要內容

程式物件與記憶體的配置方式

物件在配置時能被儲存在五個地方:
1.暫存器(Registers)  2.堆疊(Stack)  3.堆積(Heap)
4.常數暫存空間(Constant storage)   5.Non-RAM儲存空間

以下對這五種方式做說明


1.暫存器(Registers):
   暫存器內建於CPU內,所以是速度最快的儲存位置
   但因為數量有限,所以這裡的物件配置都由編譯器來決定
   自由度比較高的C或C++也僅能向編譯器建議暫存器的配置

2.堆疊(Stack):
   堆疊的位置位於一般的RAM裡,處理器經由其指標(stack pointer)提供直接支援來運作
   當程式配置一塊記憶體時,stack指標會往後移動;釋放記憶體則會讓指標往前移回
   堆疊很快也很有效率,速度僅次於暫存器

   因為Java的編譯器必須自行建立移動stack pointer的程式碼
   所以必須要完全掌握存在stack裡的資料的實際大小與存活時間
   因為這個限制,儘管物件的reference可以儲存於其上,但一般的Java物件並不能如此

3.堆積(Heap):
   Heap是通用性質的記憶體儲存空間,也位在RAM裡
   與stack不同的是,它不需要事先知道必須配置於其上的物件大小與存活時間
   所以它有了相當的彈性

   Heap也是Java放置一般Java物件的地方
   每當在程式中執行 new 指令時,就會在heap上配置
   當然有彈性的另一面是配置的時間較stack來的長

4.常數暫存空間(Constant storage):
   因為常數值不會改變,所以有時候會被放在ROM(read-only memory)或內嵌式系統中
   內嵌式系統的例子舉Java的string pool,它是特殊的儲存空間

5.Non-RAM儲存空間:
   如果資料可以獨立於程式外,這類物件通常被儲存於磁碟裡
   這一類儲存空間的特色是,可以將物件轉換為可儲存於其他媒介的形式
   必要時也可以還原成儲存於RAM中的一般物件


我們稱呼在撰寫程式過程中常用到的類別為基本型別(primitive types)
要特別的處理它是因為透過 new 來配置這種極小、簡單的變數於heap上,效率不佳
Java採取C/C++的方式來處理,也就是不用 new 來配置其空間
這產生了"automatic"變數(不再使用reference型態)
這類變數直接存放資料值,並配置在stack上以取得較佳的效率

留言