以下內容摘自《java編程思想》第三版:
程式運行時,對象是怎麼進行放置安排的呢?特別是記憶體是怎麼分配的呢?有六個不同的地方可以用來儲存資料:
1、寄存器:這是最快的儲存區,因為它位於不同於其他儲存區的地方——處理器內部。但是寄存器的數量極其有限,所以寄存器根據需求進行分配。你不能直接控制,也不能再程式中感覺到寄存器存在的跡象。
2、堆棧:位於通用RAM(隨即訪問儲存空間)中,但通過“堆棧指標”可以從處理器那裡獲得直接支援。堆棧指標若向下移動,則分配新的記憶體;若向上移動,則釋放那裡的記憶體。這是一種快速有效分配儲存方法,僅次與寄存器。建立程式時,Java系統必須知道儲存在堆棧內所有項的確切生命週期,以便上下移動堆棧指標。這一約束限制了程式的靈活性,所有雖然某些Java資料存放區與堆棧中---特別是對象引用,但是java對象並不儲存於其中。
3、堆:一種通用的記憶體池(也位於RAM區),用於存放所有Java對象,堆不同於堆棧的好處是:編譯器不需要知道從堆裡分配多少儲存地區,也不必知道儲存在堆內所有資料在堆裡存活多長時間。因此,在堆裡面分配儲存有很大的靈活性。但需要一個對象時,只需要new寫一行簡單的代碼,當執行這行代碼時,會自動在堆裡進行儲存分配。當然,為這種靈活性必須要付出相應的代價:用堆進行儲存分配和清理可能比用堆棧進行儲存分配需要更多的時間。
4、靜態儲存:這裡的“靜態”是指“位於固定位置”(儘管也在RAM裡)。靜態儲存裡存放程式運行時一直存在的資料。可用關鍵字static來標識某個對象的特定元素是靜態。但Java對象本身永遠都不會置入靜態儲存空間。
5、常量儲存:常量值通常直接存放在程式碼內部,這樣做是安全的,因為他們永遠不會被改變。有時,在嵌入式系統中,常量本事會和其他部分隔離開,所以在這種情況下,可以選擇將其存放在ROM(唯讀記憶體)中。
6、非RAM儲存:如果資料完全存活於程式之外,那麼它可以不受程式的任何控制,在程式沒有運行時也可以存在,其中兩個基本的例子是流對象和持久化對象。在流對象中,對象轉化成位元組流,通常被發送給另一台機器。在“持久化對象”中,對象被存放於磁碟上,因此,即使程式終止,它們仍可以保持自己的狀態。這種儲存方式的技巧在於:把對象轉化成可以存放在其他媒介上的事物,在需要時,可恢複成常規的、基於RAM的對象。Java提供了對輕量級持久化對象的支援。