??此前對數(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)部陵究,這樣做是安全的,因為他們永遠不會被改變奥帘。有時铜邮,在嵌入式系統(tǒng)中,常量本身會和其它部分隔離開,所以在這種在這種情況下松蒜,可以選擇將其存放在ROM只讀存儲器中扔茅。
5.非RAM存儲
??如果數(shù)據(jù)完全存活于程序之外,那么它可以不受程序的任何控制秸苗,在程序沒有運行時也可以存在召娜。其中兩個基本的例子是流對象和持久化對象。在流對象中惊楼,對象轉(zhuǎn)化成字節(jié)流玖瘸,通常被發(fā)送給另一臺機器。在“持久化對象”中檀咙,對象被存放在磁盤上雅倒,因此即使程序終止,他們?nèi)钥梢员3肿约旱臓顟B(tài)攀芯。這種存儲方式的技巧在于:把對象轉(zhuǎn)化成可以存放到其它媒介上的失誤屯断,在需要時文虏,可恢復成常規(guī)的侣诺,給予RAM對象。Java提供了對輕量級持久化的支持氧秘,而諸如JDBC和Hibernanate這樣的機制提供了更加復雜的對在數(shù)據(jù)庫中存儲和讀取對象信息的支持年鸳。