Java虛擬機運行時數據區

在JAVA中,有六個不同的地方可以存儲數據:
1. 寄存器(register)。這是最快的存儲區,因爲它位於不同於其他存儲區的地方——處理器內部。但是寄存器的數量極其有限,所以寄存器由編譯器根據需求進行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。


2. 堆棧(stack)。位於通用RAM中,但通過它的“堆棧指針”可以從處理器哪裏獲得支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次於寄存器。創建程序時候,JAVA編譯器必須知道存儲在堆棧內所有數據的確切大小和生命週期,因爲它必須生成相應的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些JAVA數據存儲在堆棧中——特別是對象引用,但是JAVA對象不存儲其中。


3. 堆(heap)。一種通用性的內存池(也存在於RAM中),用於存放所以的JAVA對象。堆不同於堆棧的好處是:編譯器不需要知道要從堆裏分配多少存儲區域,也不必知道存儲的數據在堆裏存活多長時間。因此,在堆裏分配存儲有很大的靈活性。當你需要創建一個對象的時候,只需要new寫一行簡單的代碼,當執行這行代碼時,會自動在堆裏進行存儲分配。當然,爲這種靈活性必須要付出相應的代碼。用堆進行存儲分配比用堆棧進行存儲存儲需要更多的時間


4. 靜態存儲(static storage)。這裏的“靜態”是指“在固定的位置”。靜態存儲裏存放程序運行時一直存在的數據。你可用關鍵字static來標識一個對象的特定元素是靜態的,但JAVA對象本身從來不會存放在靜態存儲空間裏。


5. 常量存儲(constant storage)。常量值通常直接存放在程序代碼內部,這樣做是安全的,因爲它們永遠不會被改變。有時,在嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中。


6. 非RAM存儲。如果數據完全存活於程序之外,那麼它可以不受程序的任何控制,在程序沒有運行時也可以存在。
就速度來說,有如下關係:
    寄存器 < 堆棧 < 堆 < 其他

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


程序的執行需要一定的內存空間,如字節碼、被加載類的其他額外信息、程序中的對象、方法的參數、返回值、本地變量、處理的中間變量等等。Java虛擬機將 這些信息統統保存在數據區(dataareas)中。雖然每個Java虛擬機的實現中都包含數據區,但是Java虛擬機規範對數據區的規定卻非常的抽象。 許多結構上的細節部分都留給了Java虛擬機實現者自己發揮。不同Java虛擬機實現上的內存結構千差萬別。一部分實現可能佔用很多內存,而其他以下可能 只佔用很少的內存;一些實現可能會使用虛擬內存,而其他的則不使用。這種比較精煉的Java虛擬機內存規約,可以使得Java虛擬機可以在廣泛的平臺上被 實現。


     數據區中的一部分是整個程序共有,其他部分被單獨的線程控制。每一個Java虛擬機都包含方法區(methodarea)和堆(heap),他們都被整個 程序共享。Java虛擬機加載並解析一個類以後,將從類文件中解析出來的信息保存與方法區中。程序執行時創建的對象都保存在堆中。


     當一個線程被創建時,會被分配只屬於他自己的PC寄存器“pcreGISter”(程序計數器)和Java堆棧(Javastack)。當線程不掉用本地 方法時,PC寄存器中保存線程執行的下一條指令。Java堆棧保存了一個線程調用方法時的狀態,包括本地變量、調用方法的參數、返回值、處理的中間變量。 調用本地方法時的狀態保存在本地方法堆棧中(nativemethodstacks),可能再寄存器或者其他非平臺獨立的內存中。


     Java堆棧有堆棧塊(stackframes(orframes))組成。堆棧塊包含Java方法調用的狀態。當一個線程調用一個方法時,Java虛擬機會將一個新的塊壓到Java堆棧中,當這個方法運行結束時,Java虛擬機會將對應的塊彈出並拋棄。


     Java虛擬機不使用寄存器保存計算的中間結果,而是用Java堆棧在存放中間結果。這是的Java虛擬機的指令更緊湊,也更容易在一個沒有寄存器的設備上實現Java虛擬機。

 

    詳情另見 http://www.blogjava.net/aimee/archive/2008/12/03/105084.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章