JAVA虛擬機的重要組成

眾所周知,Java支持平臺無關性、安全性和網絡移動性。而Java平臺由Java虛擬機和Java核心類所構成,它為純Java程序提供了統一的編程接口,而不管下層操作系統是什麼。正是得益於Java虛擬機,它號稱的“一次編譯,到處運行”才能有所保障。

線程計數器,是一塊較小的內存空間,用來指定當前線程執行字節碼的行數,每個線程計數器都是私有的,因為每個線程都需要記錄執行的行數;這裡解釋一下為什麼每個線程都需要一個線程計數器,JVM的多線程是通過線程輪流切換分配執行時間來實現的,在任何時刻,每個處理器都只會執行一個線程中的指令,當線程進行切換的時,為了線程能恢復當正確的位置,所以每個線程必須有個獨立的線程計數器,這樣才能保證線程之間不互相影響。

這裡注意下,如果線程執行是一個Java方法的時候,計數器記錄的是虛擬機字節碼指令的地址;當執行的是Native的方法的時候,計數器指令為空;該內存區域是Java虛擬機唯一沒有規定任何OutOfMemoryError的區域。

JAVA虛擬機的重要組成

方法區

在Java虛擬機中,關於被裝載的類型信息存儲在一個方法區的內存中。當虛擬機裝載某個類型時,它使用類裝載器定位相應的class文件,然後讀入這個class文件並將它傳輸到虛擬機中,接著虛擬機提取其中的類型信息,並將這些信息存儲到方法區。方法區也可以被垃圾回收器收集,因為虛擬機允許通過用戶定義的類裝載器來動態擴展Java程序。

Java棧

每當啟動給一個線程時,Java虛擬機會為它分配一個Java棧。Java棧由許多棧幀組成,一個棧幀包含一個Java方法調用的狀態。當線程調用一個Java方法時,虛擬機壓入一個新的棧幀到該線程的Java棧中,當該方法返回時,這個棧幀就從Java棧中彈出。Java棧存儲線程中Java方法調用的狀態--包括局部變量、參數、返回值以及運算的中間結果等。Java虛擬機沒有寄存器,其指令集使用Java棧來存儲中間數據。這樣設計的原因是為了保持Java虛擬機的指令集儘量緊湊,同時也便於Java虛擬機在只有很少通用寄存器的平臺上實現。另外,基於棧的體系結構,也有助於運行時某些虛擬機實現的動態編譯器和即時編譯器的代碼優化。

JAVA虛擬機的重要組成

棧幀

棧幀由局部變量區、操作數棧和幀數據區組成。當虛擬機調用一個Java方法時,它從對應類的類型信息中得到此方法的局部變量區和操作數棧的大小,並根據此分配棧幀內存,然後壓入Java棧中。

尚學堂立志解決中國教育不公平和低效率問題,幫助千千萬萬被傳統教育方式耽誤的人,傳授實用、前沿的知識,成就學員個人理想,為愛你的人和你愛的人創造美好的生活。尚學堂12大精英團隊+各類實戰項目,真正實現1+1>10的目標效果。幫助學員迅速成長,持久騰飛,成就學員“高富帥”人生。


分享到:


相關文章: