??此前對數(shù)據(jù)在內(nèi)存中的存儲一直不是很清楚,最近通過查閱資料終于對此有些了解,在java中有五大不同的地方可以存儲數(shù)據(jù):寄存器、堆棧、堆、常量存儲、非RAM存儲。
1.寄存器
??這是最快的儲存區(qū),因為它位于處理器的內(nèi)部,但是寄存器的數(shù)量有限,要根據(jù)需求進行分配,不能直接控制。不能在程序中感覺到寄存器的任何跡象。
2.堆棧
??位于通用RAM(隨機訪問存儲器)中。但通過堆棧指針可以從處理器哪里獲取直接支持。堆棧指針若向下移動,則分配新的內(nèi)存,若向上移動,則釋放那些內(nèi)存。這是一種快速有效的分配存儲方法,僅次于寄存器。創(chuàng)建程序時,java系統(tǒng)必須知道存儲在堆棧內(nèi)所有項的確切生命周期,以便于上下移動堆棧指針。這約束了程序的靈活性,所以雖然某些java數(shù)據(jù)存儲于堆棧中,特別是對象引用,但是java對象并不存儲于其中。
3.堆
??一種通用的內(nèi)存池,也位于RAM區(qū),用于存放java對象。堆不同堆棧的好處是:編譯器不需要知道存儲的數(shù)據(jù)在對堆里面存活多長時間。因此,在堆里面分配存儲有很大的靈活性,但是也因為有更大的靈活性,所以用堆進行存儲分配和清理要比用堆棧需要更長的時間。
4.常量存儲
??常量值通常存放于程序代碼內(nèi)部,這樣做是安全的,因為他們永遠(yuǎn)不會被改變。有時,在嵌入式系統(tǒng)中,常量本身會和其它部分隔離開,所以在這種在這種情況下,可以選擇將其存放在ROM只讀存儲器中。
5.非RAM存儲
??如果數(shù)據(jù)完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運行時也可以存在。其中兩個基本的例子是流對象和持久化對象。在流對象中,對象轉(zhuǎn)化成字節(jié)流,通常被發(fā)送給另一臺機器。在“持久化對象”中,對象被存放在磁盤上,因此即使程序終止,他們?nèi)钥梢员3肿约旱臓顟B(tài)。這種存儲方式的技巧在于:把對象轉(zhuǎn)化成可以存放到其它媒介上的失誤,在需要時,可恢復(fù)成常規(guī)的,給予RAM對象。Java提供了對輕量級持久化的支持,而諸如JDBC和Hibernanate這樣的機制提供了更加復(fù)雜的對在數(shù)據(jù)庫中存儲和讀取對象信息的支持。