2.21 存儲到什么地方
在程序運行時 內(nèi)存是怎么分配的 對象是怎么安置排放的 贬养?總共有五個地方可以存儲數(shù)據(jù)
1.寄存器 這是最快的存儲區(qū) 他在處理器內(nèi)部,但是寄存器內(nèi)部空間極其有限 所以寄存器根據(jù)需求進行分配 不能直接控制 也不能在程序中感覺到寄存器存在的任何跡象(另一方面 C和C++允許您向編輯器建議寄存器的分配方式)
2.堆棧眯亦。 位于通用RAM中(隨機訪問存儲器) 但通過堆棧指針可以從處理器獲得快速支持。堆棧指針若向下移動般码,則分配新的內(nèi)存妻率,若想上移動,則釋放那些內(nèi)存板祝。這是一種快速有效的分配存儲方法 僅次于寄存器 宫静。 創(chuàng)建程序時 Java系統(tǒng)必須知道存儲在堆棧內(nèi)所有項的確切生命周期 ,以便上下移動堆棧指針 這一約束限制了程序的靈活性券时,所以雖然某些Java數(shù)據(jù)存儲于堆棧中----特別是對象引用 但是Java對象并不存儲與期中
3.棧 一種通用的內(nèi)存池 (也位于RAM中) 用于釋放所有的Java對象孤里。堆不同于堆棧的好處是:編譯器不需要知道存儲的數(shù)據(jù)在堆里存活多長時間 因此 在堆里分配存儲具有很大的靈活性 當(dāng)需要一個對象時 只需要用new寫一行簡單的代碼 當(dāng)執(zhí)行這行代碼是 會自動在堆里進新存儲分配
當(dāng)然 為這種靈活性必須付出相應(yīng)的代價 用堆進行存儲分配和清理可能比用堆棧進行存儲分配的需要更多的時間 (確實可以在Java中像C++一樣創(chuàng)建對象)
4.常量存儲 常量值通常直接存放在程序代碼內(nèi)部 這樣做是安全的 因為這樣永遠不會被改變 有時 在嵌入式系統(tǒng)中,常量本身會和其他部分分隔開 所以在這種情況下 可以選擇將其存儲與ROM(只讀存儲器)中
5.非RAM存儲 如果數(shù)據(jù)完全存活于程序只外 那么它可以不受程序的任何控制 在程序沒有運行時也存在 橘洞。其中兩個基本的例子是流對象和持久層對象 1.在流對象中 對象轉(zhuǎn)化成字節(jié)流捌袜,通常被發(fā)送給另一臺機器。在”持久層對象中“炸枣,對象被存放在磁盤上 因此 即使程序終止 它們熱可以保持自己的狀態(tài) 這種存儲方式的技巧在于 把對象轉(zhuǎn)化成 可以存放在其他媒介上的事務(wù)虏等,在需要時 可恢復(fù)成常規(guī)的,基于RAM的對象 抛虏。 Java 提供了對輕量級持久化的支持博其,而諸如JDBC和Hibernate這樣的機制提供了更加復(fù)雜的對在數(shù)據(jù)庫中存儲和讀取對象信息的支持