一 執行時棧幀結構 : 棧幀分配多少記憶體,與執行時無關
1: 區域性變數表 : 容量以slot 槽為單位
乙個slot 占用32位長度的記憶體空間,可以存的型別有boolean、byte、char、short、int、float、reference、retuanaddress .
二個slot 可以存long double 型別
2: 運算元棧 : 後入先出
當乙個方法剛剛開始執行的時候,這個方法的運算元棧是空的,在方法的執行過程中,會有各種位元組碼指令在運算元棧中,入棧和出棧。
棧幀中包含乙個指向執行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支援方法呼叫過程中的動態鏈結
class 檔案常量池中存在大量的符號引用,位元組碼中的方法呼叫指令就是用常量池中指向方法的符號引用作為引數。
靜態解析: 符號引用會在類載入時轉化為直接引用
4: 方法返回位址
1、方法退出後,都需要返回到方法被呼叫的位置,程式才能繼續執行。
二、方法呼叫 : 任務是確定被呼叫方法的版本,暫時還不涉及方法內部的具體執行過程。
1、解析(靜態)將class檔案符號引用轉化為直接引用 (因為符號引用不是實際的入口位址)
有兩種方法, 靜態方法: 與型別直接關聯,私有方法: 外部不可被訪問 ,都它們都適合在類載入階段解析。
解析呼叫一定是個靜態的過程,在編譯期間就完全確定。
2、分派 (動態和靜態): 分派呼叫將會揭示多型性的一些最基本體現,過載和重寫 ,關心虛擬機器如何確定正確的目標方法。
(1)靜態分派 (過載方法): 依賴靜態型別來定位方法執行版本的分派動作
(2)動態分派 (重寫): 依賴實際型別來定位方法執行 版本的分派動作
通過在方法區上的虛方法表來實現動態分派
(3)方法的接受者和方法引數(宗量): 單分派是根據乙個宗量,多分派多個
3、動態語言 : 它的型別檢查過程時在執行期而不是編譯期。
三、問題 虛擬機器是如何執行方法中的位元組嗎指令的?下面是幾種方法
基於棧的位元組碼解釋執行引擎
1、 解釋執行
基於棧的指令集與基於暫存器的指令集
1+1
1、基於棧的指令集
iconst_1
iconst_1
iadd
istore_0
2、基於暫存器
mov eax,1
add eax,1
3、基於棧的直譯器執行過程
列子原始碼
public int calc(){
int a = 100;
int b = 200;
int c = 300;
return (a+b) *c
位元組嗎public int calc(){
code :
stack =2,locals=4,args_size=1
0: bipush 100
2: istore_1
3: sipush 200
6: istore_2
7: sipush 300
10: istore_3
11: iload_1
12: iload_2
13: iadd
14:iload_3
15:imul
16:ireturn
虛擬機器位元組碼執行引擎
1.概述 虛擬機器 是乙個相對於 物理機 的概念,這兩種機器都有 執行能力,其區別是物理機的執行引擎是直接建立在處理器 硬體 指令集和作業系統層面上的,而虛擬機器的執行引擎是自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執行那些不被硬體直接支援的指令集格式。2.執行時棧幀結構 棧幀...
JVM之虛擬機器位元組碼執行引擎
執行時棧幀結構 棧幀儲存方法的區域性變數表 運算元棧 動態鏈結和方法返回位址等,每乙個方法由開始到結束,都對應著乙個棧幀在虛擬機器裡面的出棧入棧過程。對於執行引擎來說,在活動的執行緒中,只有位於棧頂的棧幀才有效,叫做當前棧幀,與這個棧幀相關聯的方法叫做當前方法。區域性變數表 是一組變數值儲存空間,存...
JVM 8 虛擬機器位元組碼執行引擎
在活動執行緒中,只有棧頂的棧時有效的,稱為當前棧幀,與這個棧幀相關聯的方法稱為當前方法。下面對棧幀的4個主要部分進行分析。存放方法引數和方法內部定義的區域性變數 一些細節 優點 可移植性 更加緊湊 編譯器實現更緊湊。確定就是速度更慢。指向執行時常量池中該棧幀所屬方法的引用,這個引用的為了支援方法呼叫...