您好,登錄后才能下訂單哦!
本篇內容主要講解“Java虛擬機內部由什么構成”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java虛擬機內部由什么構成”吧!
Java虛擬機是一個想象中的機器,正如其名是虛擬的。在實際計算機上市通過軟件模擬實現的。它有虛擬的硬件,如處理器、堆棧、寄存器等,還有相應的指令系統。它屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼即字節碼,這樣就可以在多個平臺上不加修改的運行。Java虛擬機在執行字節碼時,把字節碼解釋成具體平臺上的機器指令執行。這正是Java語言具有與平臺無關性的原因。
Java虛擬機由五部分組成:指令集、寄存器、棧、無用單元回收堆(garbage-collected-heap)、方法區域。它們構成了Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但他們的功能必須在真實機器上以某種方式實現。Java虛擬機支持大約248個字節碼。每個字節碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當于Java程序的匯編語言。其中的指令包含一個單字節的操作符,用于指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅有一個單字節的操作符構成。虛擬機的內層循環的執行過程如下:
do{取一個操作符字節:根據操作符的值執行一個動作;}while(程序未結束)
由于指令系統的簡單性,使得虛擬機的執行過程十分簡單,從而有利于提高執行效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個字節大那么它存儲的順序是高字節優先。例如,一個16位的參數存放時占用兩個字節,其值為***個字節×256+第二個字節。字節碼指令流一般只是字節對齊的。指令tableswitch和lookup是例外,這兩條指令內部要求強制的4字節邊界對齊。
Java虛擬機的寄存器用于保存機器的運行狀態,與微處理器中的某些專用寄存器類似。Java虛擬機的寄存器有4種:pc:Java程序計數器,optop:指向操作數棧頂端的指針,frame:指向當前執行環境的指針,vars:指向當前執行方法的局部變量區***個變量的指針。Java虛擬機是棧式的,他不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性特別是對于寄存器數目不多的處理器。所有寄存器 都是32位的。
Java虛擬機的棧有三個區域:局部變量區、運行環境區、操作數區。局部變量區每個Java方法使用一個固定大小的局部變量集。它們按照與ars寄存器的字偏移量來尋址。局部變量都是32位的。長整數和雙精度浮點數占據了2個局部變量的空間,卻按照***個局部變量的索引來尋址。虛擬機規范并不要求在局部變量中的64 為的值是64位對其的虛擬機提供了把局部變量中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變量的指令。
在運行環境中包含的信息用于動態鏈接,正常的方法返回以及異常傳播。運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用于支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變量時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,并把變量訪問翻譯成與這些變量運行時的存貯結構相應的偏移地址。動態鏈接方法和變量使的方法中使用的其它類的變化不會影響到本程序的代碼。如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用于恢復調用者的寄存器,并把調用者的寄存器計算器增加一個恰當的值,一跳過已執行過的方法。調用指令然后再調用者的執行環境中繼續執行下去。異常情況下在Java中被稱作error(錯誤)或exception(異常),是throwable類的子類。在程序中出錯的原因是動態鏈接出錯如無法找到所需class文件,運行時出錯如一個空指針的引用。程序使用了throw語句。
當異常發生時,Java虛擬機采取如下措施:檢查與當前方法相關的catch子句表,每個catch子句包含其有效指令范圍,能夠處理異常類型以及處理異常代碼塊地址。與異常相匹配的catch子句應該符合一下條件:造成異常的指令在指令范圍內,發生異常類型是其能夠處理的異常類型的子類型。如果找到了匹配的catch子句,那么系統轉到異常處理模塊執行;否則重復尋找直到找到為止。如果找不到則得到一個“未截獲異常”的結果并返回到當前方法的調用者好像異常剛剛在其調用者中發生一樣。如果調用者仍然沒有找到相應的異常處理,那么系統將調用一個缺省的異常處理模塊。
機器指令只從操作數棧中取操作數,對他們進行操作,并把結果返回到棧中。棧用于給方法傳遞參數并從方法接受結果,也用于支持操作數的參數并保存操作結果。Java的堆是一個運行時數據區,類的實例從中分配空間。Java語言有無用單元回收功能:不給程序員顯式釋放對象的能力。不規定具體使用的無用單元收集算法。可以根據系統需求使用各種各樣的算法。
方法區與傳統語言中的編譯后代碼或是unix進程中的正文段相似。保存方法代碼(編譯后的Java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用回收集堆中但計劃在將來的版本實現。
到此,相信大家對“Java虛擬機內部由什么構成”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。