程序計數器是一塊較小的內存區域,它的作用可以看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型里(各種虛擬機可能會通過一些更高效的方式去實現),字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
由于java虛擬機的多線程是通過線程輪流切換并分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對于多核處理器來說是一個內核)只會執行一條線程中的指令。因此,為了線程切換后能恢復到正確的執行位置,每條線程都需要一個獨立的程序計數器,各條線程之間的計數器互不影響,獨立存儲。
JAVA虛擬機棧也是線程私有的,每個方法被執行的時候都會同時創建一個棧幀,用于存儲局總變量表、操作棧、動態鏈接、方法出口等信息。每一個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
局部變量表存放了編譯期可以知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型)和returnAddress類型(指向了一條字節碼指令的地址)。其中64位長度的long和double類型的數據會占用2個局部變量空間,其余的數據類型占用1個。局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的,在方法運行期間不會改變局部變量表的大小。
本地方法棧與虛擬機所發揮的作用是非常相似的,其區別不過是虛擬機棧為虛擬機執行Java方法服務,而本地方法棧則是為虛擬機使用到的Native方法服務
新聞熱點
疑難解答