Java中把儲存區分為6類。分別為寄存器(register)、棧(stack)、堆(heap)、靜態儲存區(static storage)、常量儲存區(constant storage)以及非隨機存取儲存區(Non-RAM)。
1. 寄存器(register).寄存器與其他的儲存區不同,它位於CPU中,所以它是存取速度最快的儲存區.但是由於CPU中寄存器的數量是非常有限的,所以寄存器的使用是由CPU按需進行分配.編程的時候我們沒有必要去對它進行直接控制.並且在程式中也沒辦法找到到底什麼時候使用了寄存器的依據.
2. 棧(stack).它位於隨機存取儲存空間(RAM)中,並通過由CPU直接支援的棧指標(stack pointer)來進行操作.棧指標通過向下移動來分配新的儲存空間,並通過向上移動來釋放儲存空間.這是僅次於寄存器的另一種高速有效地分配儲存空間的方式.在建立程式期間,Java編譯器必須知道儲存在棧上的所有資料的準確大小和它們的生命週期.這樣它才能夠產生代碼來讓棧指標上下地移動.但這種約束限制了代碼的靈活性,所以當某些Java儲存區在棧上的時候——特別是,對象引用(object
reference)――而Java對象本身並不被儲存在棧上.
3. 堆(heap).這是儲存Java所有對象的記憶體池(同樣在RAM地區中).堆的優點是,它不像棧一樣,編譯器並不需要知道它應該從堆中分配多大的儲存空間,或者儲存空間應該在堆上存在多久.因此,在堆上分配多大的儲存空間具有很大的靈活性.無論你何時需要建立對象,你只需要簡單的在代碼中使用關鍵字new來建立它就行了.在這段代碼被執行時候就在堆(heap)上面分配相應的儲存空間.當然,為這樣的靈活性也需要付出一定的代價:在堆上分配儲存空間比在棧上分配儲存空間要更加耗時(如果你能夠在Java中像在C++一樣,在stack上建立對象的話).
4. 靜態儲存區(static storage).”靜態(static)”在這裡表示”在一個固定的位置”(儘管它同樣在RAM中).靜態儲存區包括:對於程式的整個運行期間都有效資料.你能夠使用關鍵字static來指定特殊的對象為靜態.但是Java對象自身卻從來不放置在靜態儲存區中.
5. 常量儲存區(constant storage).常量通常被直接放置在程式碼當中.這是安全的,因為它們永遠不能被改變.在某些時候多個常量能夠自己分隔開,這樣在嵌入式系統中可以被任意地放置在唯讀記憶體(ROM)中.
6. 非RAM儲存區(non-RAM storage).如果資料完全存在於程式之外,在程式未被運行時資料也能存在,而不受程式的控制.對於此類情況,有兩個主要的例子來說明:一,物件流程(streamed objects),這種對象通常以位元組流的形式被送到其他的機器去.二,持久化對象(persistent objects),這種對象存放在磁碟上,即便是程式中止以後它們仍然保持原有狀態.這些儲存空間都是將對象以某種形式儲存在其他的介質中,然後在需要的時候再把它恢複為常規的基於RAM的對象.Java提供了對輕量級持久性的支援.在未來的Java版本中,Java將提供更加完備的持久性的支援.