標籤:
java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個地區,這些地區都有各自的用途,以及建立和銷毀的時間,有的地區隨著虛擬機器進程的啟動而存在,有些地區則依賴著使用者的線程的啟動和結束而建立和銷毀。根據java 虛擬機器規範的規定,java虛擬機器所管理的記憶體將會包括以下幾個運行時資料區域。
如所示:
java虛擬機器運行時資料區可以分為:
程式計數器 堆 方法區 運行時常量池 本地方法棧 java虛擬機器棧。其中程式計數器、java棧、本地方法棧,是根據線程的啟動而建立的;而堆、方法區、運行時常量池是隨著jvm的啟動而建立的,其中的資料是可以被各個線程所共用的。
(圖片摘自:http://286.iteye.com/blog/1928180,個人覺得比《深入理解java虛擬機器》上的那張圖要清晰)
1,程式計數器
程式計數器是一塊較小的記憶體空間,它可以看作是當前線程所執行的位元組碼的行號指標。由於java虛擬機器的多線程是通過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器都會只執行一條線程中的指令。因此為了線程切換後都能恢複正確的執行位置,每個線程都有一個獨立的程式計數器。如果線程正在執行的是一個java方法,這個計數器記錄的就是正在執行的虛擬機器位元組碼指令的地址;如果正在執行的是native方法,這個計數器值則為空白。
2,java虛擬機器棧
java虛擬機器棧也是線程私人的,它的生命週期與線程相同的。虛擬機器棧描述的是java方法執行的記憶體模型:每個方法在執行的同時都會建立一個棧幀(stack frame)。用於儲存局部變數表、運算元棧、動態連結、方法出口等資訊。每一個方法從調用直到執行完成的過程,就對應著一個棧帖在虛擬機器中入棧到出棧的過程。java虛擬機器棧用來儲存棧幀,而棧幀持有局部變數和部分結果以及參與方法的調用與返回。
幀用於儲存局部變數表、運算元棧、動態連結、方法出口和投遞異常等資訊。當方法調用結束結束時,幀才會被銷毀;幀由建立幀的線程的java棧分配空間,每個幀都擁有自己的本地變數數組、運算元棧、以及運行常量池的引用
3,本地方法棧
本地方法棧(native method stack)與虛擬機器發揮的作用是非常類似的,它們之間的區別不過是虛擬機器棧執行的是java方法,而本地方法棧則為java虛擬機器所使用到native方法服務。
4,java堆
對於大多數應用來說,java(堆)是java虛擬機器所管理記憶體中的最大的一塊。java 堆是被所有線程共用的一塊記憶體地區,在虛擬機器啟動時建立。它的主要目的就是為了建立對象執行個體,向乎所有對像的執行個體都是在這裡分配。
5,方法區
方法區與java堆一樣,是各個線程共用的記憶體地區,它用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的代碼等資料。
運行時常量池是方法區的一部分.Class檔案中除了有類的版本、欄位、方法、介面等描述資訊外,還有一項資訊就是常量池用於儲存編譯期產生的各種字面量以及符號引用。
---恢複內容結束---
Java Runtime Data Area