物件在配置時能被儲存在五個地方:
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上以取得較佳的效率
沒有留言:
張貼留言