电竞比分网-中国电竞赛事及体育赛事平台

分享

JAVA中的數據存儲(堆及堆棧)(轉載)

 520jefferson 2014-01-12
在JAVA中,有六個不同的地方可以存儲數據: 
1. 寄存器(register)。這是最快的存儲區(qū),因為它位于不同于其他存儲區(qū)的地方——處理器內部。但是寄存器的數量極其有限,所以寄存器由編譯器根據需求進行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。 
2. 堆棧(stack)。位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次于寄存器。創(chuàng)建程序時候,JAVA編譯器必須知道存儲在堆棧內所有數據的確切大小和生命周期,因為它必須生成相應的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些JAVA數據存儲在堆棧中——特別是對象引用,但是JAVA對象不存儲其中。 
3. 堆(heap)。一種通用性的內存池(也存在于RAM中),用于存放所以的JAVA對象。堆不同于堆棧的好處是:編譯器不需要知道要從堆里分配多少存儲區(qū)域,也不必知道存儲的數據在堆里存活多長時間。因此,在堆里分配存儲有很大的靈活性。當你需要創(chuàng)建一個對象的時候,只需要new寫一行簡單的代碼,當執(zhí)行這行代碼時,會自動在堆里進行存儲分配。當然,為這種靈活性必須要付出相應的代碼。用堆進行存儲分配比用堆棧進行存儲存儲需要更多的時間。 
4. 靜態(tài)存儲(static storage)。這里的“靜態(tài)”是指“在固定的位置”。靜態(tài)存儲里存放程序運行時一直存在的數據。你可用關鍵字static來標識一個對象的特定元素是靜態(tài)的,但JAVA對象本身從來不會存放在靜態(tài)存儲空間里。 
5. 常量存儲(constant storage)。常量值通常直接存放在程序代碼內部,這樣做是安全的,因為它們永遠不會被改變。有時,在嵌入式系統(tǒng)中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中 
6. 非RAM存儲。如果數據完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運行時也可以存在。 
就速度來說,有如下關系: 
    寄存器 < 堆棧 < 堆 < 其他 

『上面這段話摘取之《Thinking in Java》』 

在這里,主要要說下堆與堆棧的關系: 

      堆:堆是heap,是所謂的動態(tài)內存,其中的內存在不需要時可以回收,以分配給新的內存請求,其內存中的數據是無序的,即先分配的和隨后分配的內存并沒有什么必然的位置關系,釋放時也可以沒有先后順序。一般由使用者自由分配,malloc分配的就是堆,需要手動釋放。 

      堆棧:就是STACK。實際上是只有一個出入口的隊列,即后進先出(First     In     Last     Out),先分配的內存必定后釋放。一般由,由系統(tǒng)自動分配,存放存放函數的參數值,局部變量等,自動清除。 

還有,堆是全局的,堆棧是每個函數進入的時候分一小塊,函數返回的時候就釋放了,靜態(tài)和全局變量,new     得到的變量,都放在堆中,局部變量放在堆棧中,所以函數返回,局部變量就全沒了。 

其實在實際應用中,堆棧多用來存儲方法的調用。而堆則用于對象的存儲。 

       JAVA中的基本類型,其實需要特殊對待。因為,在JAVA中,通過new創(chuàng)建的對象存儲在“堆”中,所以用new 創(chuàng)建一個小的、簡單的變量,如基本類型等,往往不是很有效。因此,在JAVA中,對于這些類型,采用了與C、C++相同的方法。也就是說,不用new 來創(chuàng)建,而是創(chuàng)建一個并非是“引用”的“自動”變量。這個變量擁有它的“值”,并置于堆棧中,因此更高效。 

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多