java虛擬機在執行java程序的過程中會把它所管理的內存劃分為若干個區域,這些區域都有各自的用途,以及創建和銷毀的時間,有的區域隨著虛擬機進程的啟動而存在,有些區域則依賴著用戶的線程的啟動和結束而建立和銷毀。根據java 虛擬機規范的規定,java虛擬機所管理的內存將會包括以下幾個運行時數據區域。
如下圖所示:
java虛擬機運行時數據區可以分為:
程序計數器 堆 方法區 運行時常量池 本地方法棧java虛擬機棧。其中程序計數器、java棧、本地方法棧,是根據線程的啟動而創建的;而堆、方法區、運行時常量池是隨著jvm的啟動而創建的,其中的數據是可以被各個線程所共享的。

(圖片摘自:http://286.VEvb.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文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息就是常量池用于存儲編譯期生成的各種字面量以及符號引用。
---恢復內容結束---
|
新聞熱點
疑難解答