java 虚拟机 字节码,JAVA虚拟机:虚拟机字节码执行引擎
“虛擬機”是一個相對“物理機”的概念,這兩種機器都有代碼執行能力。
物理機的執行引擎是直接建立在處理器、硬件、指令集和操作系統層面上的。
虛擬機的執行引擎由自己實現,自行制定指令集與執行引擎的結構體系,并可執行不被硬件直接支持的指令集格式。
在虛擬機規范中,制定了虛擬機字節碼執行引擎的概念模型,為各種虛擬機執行引擎的統一外觀。
執行引擎在執行java代碼時候可能會有解釋執行和編譯執行兩種模式。
輸入:字節碼? 處理:字節碼解析 輸出:執行結果
虛擬機的方法調用
虛擬機的字節碼執行
棧幀:存在于虛擬機棧內存中,用于支持虛擬機進行方法調用和方法執行的數據結構。為虛擬機棧中的棧元素。
存儲數據:局部變量表、操作數棧、動態鏈接和方法返回地址。
方法調用過程即一個棧幀在虛擬機棧里從入棧到出棧的過程。
局部變量表的大小、操作數棧深度,在編譯期間已經確定,這些大小、深度寫入了方法表的Code屬性中,因此一個棧幀需要分配多少內存,不會受到程序運行
期間變量數據的影響,而僅僅取決于具體的虛擬機實現。
一個線程中的方法調用鏈很長,很多方法都同時處于執行狀態,對于執行引擎來說,在活動線程中,只有位于棧頂的棧幀才是有效的,稱為當前棧幀,與這個棧幀相關的方法稱為當前方法。
執行引擎的所有字節碼指令都只針對當前棧幀進行操作。
棧幀概念模型:? ? ? ? ? ? ? ? ? ? ? ? ? ?當前線程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 線程1? ? ? ? ? ? ? ? ? ? ?線程2
當前棧幀? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?當前棧幀? ? ? ? ? ? ? ?當前棧幀
局部變量表? ? ? ? ? ? ? ? ? ? ? ? ? ?局部變量表? ? ? ? ? ??局部變量表
操作數棧? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作數棧? ? ? ? ? ? ? ?操作數棧
動態鏈接? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??動態鏈接? ? ? ? ? ? ?? 動態鏈接
方法返回地址? ? ? ? ? ? ? ? ? ? ? ? 方法返回地址? ? ? ???方法返回地址
.............? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??.............? ? ? ? ? ? ? ??.............
棧幀N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??棧幀N? ? ? ? ? ? ? ? ? ?棧幀N
............? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???............? ? ? ? ? ? ? ? ??............
棧幀2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?棧幀2? ? ? ? ? ? ? ? ???棧幀2
棧幀1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?棧幀1? ? ? ? ? ? ? ? ? ?棧幀1
局部變量表:存放方法參數和方法內部局部變量,容量:在java程序編譯為class文件時,就在方法的code屬性的max_locals數據項中確定了該方法的所需分配的局部變量表的最大容量。
變量槽(Slot)是局部變量表中最小單位。
操作數棧:后入先出棧,可用戶算術運算或調用其他方法時候進行參數傳遞。
例子:整數加法的字節碼指令iadd在運行時候操作數棧中最接近棧頂的兩個元素已經存入兩個int型的數值,當執行這個指令時,會將這兩個int值出棧并相加,然后將相加后的結果入棧。
動態鏈接:
方法返回地址:即當前棧幀出棧,退出時執行操作:恢復上層方法的局部變量表和操作數棧,把返回值壓入調用者棧幀的操作數棧中,調整計數器的值指向后一條指令。
方法調用過程:
方法調用概念:確定被調用方法的版本
解析:所有方法調用中的目標方法在class文件里都有一個常量池中的符號引用,在類記載的解析階段,會將其中的一部分符號引用轉化為直接引用,這種解析能成立的前提是:方法在程序真正運行之前就有一個可確定的調用版本,并且這個方法的調用版本在運行期間是不可改變的。比如:靜態方法和私有方法兩大類,前者與類型直接關聯,后者在外部不可被訪問,這兩種方法各自的特點決定了他們都不可能通過繼承或別的方式重寫其他版本,因為他們都適合在類加載階段進行解析。
java虛擬機5條方法調用字節碼指令:
1、invokestatic :調用靜態方法。
2、invokespecial:調用實例構造方法、私有方法、父類方法。
3、invokevirtual:調用所有的虛方法。
4、invokeinterface:調用接口方法,會在運行時再確定一個實現此接口的對象。
5、invokedynamic:先在運行時動態解析出調用點限定符所引用的方法,然后再執行該方法,以上4條指令,分派邏輯是固化在java虛擬機內部的,而invokedynamic指令的分派邏輯是由用戶所設定的引導方法決定的。
總結
以上是生活随笔為你收集整理的java 虚拟机 字节码,JAVA虚拟机:虚拟机字节码执行引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive 两个没有null指定的表左关联
- 下一篇: 蒙特卡洛分析_随机模拟:马尔科夫链蒙特卡