由于位于處理器cpu的內部,所以其是最快的存儲區,然而寄存器的空間極其珍貴有限,所以程序開發者無法直接控制寄存器空間的分配,它的分配工作是由編譯器自行分配的.
位于通用RAM中,即內存中。它可以通過”堆棧指針”從cpu那里獲取支持,通過操作”堆棧指針”的上下移動來實現堆棧區中對內存的申請和釋放.堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,速度僅次于寄存器.
創建程序時候,JAVA編譯器必須知道存儲在堆棧內所有數據的確切大小和生命周期,因為它必須生成相應的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些JAVA數據存儲在堆棧中——特別是對象引用,但是JAVA對象不存儲其中.
跟堆棧區一樣也存在于RAM中,用于存放所有的JAVA對象。堆不同于堆棧的好處是:編譯器不需要知道要從堆里分配多少存儲區域,也不必知道存儲的數據在堆里存活多長時間。因此,在堆里分配存儲有很大的靈活性。當你需要創建一個對象的時候,只需要new寫一行簡單的代碼,當執行這行代碼時,會自動在堆里進行存儲分配。當然,為這種靈活性必須要付出相應的代碼。用堆進行存儲分配比用堆棧進行存儲存儲需要更多的時間.
存儲用static修飾的成員變量或方法.雖然static關鍵字可以用來標識一個對象是靜態的,但JAVA對象本身不會被存放在靜態存儲空間里,而是存儲在堆內存區.
常量(字符串常量和基本類型常量)通常直接存儲在程序代碼內部(常量池)。這樣做是安全的,因為它們的值在初始化時就已經被確定,并不會被改變。常量池在java用于保存在編譯期已確定的,已編譯的class文件中的一份數據。它包括了關于類,方法,接口等中的常量,也包括字符串常量,如String s = “abc”這種字面量方式.
如果數據完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運行時也可以存在.
這是一個關于堆與棧關系的引用說明
堆:堆是heap,是所謂的動態內存,其中的內存在不需要時可以回收,以分配給新的內存請求,其內存中的數據是無序的,即先分配的和隨后分配的內存并沒有什么必然的位置關系,釋放時也可以沒有先后順序。一般由使用者自由分配,在C語言中malloc分配的就是堆,需要手動釋放。 堆棧:就是stack。實際上是只有一個出入口的隊列,即后進先出(frist in , last out),先分配的內存必定后釋放。一般由,由系統自動分配,存放函數的參數值,局部變量等,自動清除。 還有,堆是全局的,堆棧是每個函數進入的時候分一小塊,函數返回的時候就釋放了,靜態和全局變量,new得到的變量,都放在堆中,局部變量放在堆棧中,所以函數返回,局部變量就全沒了。 JAVA中的基本類型,其實需要特殊對待。因為,在JAVA中,通過new創建的對象存儲在“堆”中,所以用new 創建一個小的、簡單的變量,如基本類型等,往往不是很有效。因此,在JAVA中,對于這些類型,采用了與C、C++相同的方法。也就是說,不用new 來創建,而是創建一個并非是“引用”的“自動”變量。這個變量擁有它的“值”,并置于堆棧中,因此更高效。 實際上類的實例方法在內存中是只有一份,不過肯定不會是第一個對象中,如果是第一個對象的話,那么當第一個對象被銷毀的時候,那么后面的對象就永遠無法調用了。 類的實例方法存在一個專門的區叫方法區(method area),事實上類剛裝載的時候就被裝載好了,不過它們在”睡眠”,只是這些方法必須當有對象產生的時候才會”蘇醒”.(比如,一個輸出類的成員變量的方法,如果連對象都沒有,何來的輸出成員變量).所以,方法在裝載的時候就有了,但是不可用,因為它沒有指象任何一個對象. 而靜態的又不一樣了,靜態的東西存在靜態存儲(static storage)區,他們和類是一個等級的,就是說只要類被裝載,它們就可以直接用.(用類名來調用).他們不依賴與任何對象,所以也不能輸出任何對象的成員屬性.(除非成員屬性也是靜態的). 每個對象在new的時候都會在堆區中開辟內存,用來保存對象的屬性和方法.(實際上方法保存的只是方法區的引用,如果保存的是方法本身,那么試想一下,有多少個對象就得有多少個方法,那么又和第一點中”實例方法在內存中只有一份拷貝”相矛盾了)。
假設我們定義了兩個局部變量(注意局部變量和方法形參才保存在棧中,成員變量是保存在堆中,不要混淆了) int s1=20;int s2=20;編譯器工作流程如下:
在棧中申請一個名為”s1”的存儲空間,然后查看棧中是否存放著一個”20”的值;如果棧中不存在”20”的值,就向棧中添加一個”20”的值,然后讓s1等于這個值.如果棧中存在”20”的值,就讓s1等于這個值而不用在棧中重新加入一個”20”的值.完成了對s1的數據分配后,由于s2=20,所以就不用再為s2在棧中重新分配”20”這個值了,這樣就實現了數據共享,節省了內存空間.新聞熱點
疑難解答