JVM007_运行时栈帧结构
運行時棧幀結構
執行引擎是JVM的核心組件之一。
所有Java虛擬機的執行引擎輸入輸出都是一致的:輸入的是字節碼二進制流,處理過程是字節碼解析執行的等效過程,輸出的是執行結果。
JVM以方法作為作基本的執行單元。“棧幀”是用于支持虛擬機進行方法調用和方法執行背后的數據結構。這里的方法調用指的是確定調用那一個方法,也是JVM運行時數據區中棧的棧元素。棧幀存儲的內容主要有:局部變量表,操作數棧,動態連接和方法返回地址信息等。
局部變量表
局部變量表是一組變量的存儲空間。用以存儲方法參數和方法內的局部變量。在編譯時其最大容量就被確定下來,并被寫到方法的Code屬性中的max_locals數據項中。
局部便量表的容量以變量槽為單位。在《JVM規范》中并沒有明確的指定一個槽占用的內存的大小為多少,而是導向性的說:每個變量槽都應該能存放一個char,boolean,short,int,byte,float,reference,returnAddress數據類型。這八個數據類型都可以用32位或者更少的物理內存來存儲。這意味著一個變量槽所占用的物理內存可以隨著處理器、操作系統或者虛擬機實現的不同而發生變化,只是變量槽的外觀與32位虛擬機一致。
下面的討論如果涉及到變量槽沒有特殊說明那么都是基于32位虛擬機
reference類型一般需要滿足兩個條件:
1. 通過該引用能夠直接或間接的查找到對象在Java堆中的數據存放的起始地質或索引。
2. 通過該引用能夠直接或間接地查找到該對象對應的數據類型在方法區中的存儲的類型信息。
returnAddress目前很少見了,用來為字節碼指令jsr,jsr_w,ret服務的,指向一條字節碼指令的地址,在一些古老的虛擬機中用來實現異常處理時的跳轉,目前都是用異常表來處理異常的。
對于long,double這兩種64位的數據類型,需要兩個變量槽來表示。由于局部變量表是建立在線程內,且對其他線程是不可見的,所以不會存在數據競爭和線程安全問題。對于相鄰的共同存放一個64位數據結構的變量,虛擬機不允許采取任何方式獨立訪問其中一個變量槽。若遇到就拋出異常。
當一個方法調用時,若方法不是靜態方法,那邊變量槽第一個槽中會存放所屬對象的引用,也就是this。變量槽是可以被復用的,當一個變量槽中的變量在字節碼執行超過其范圍后,就可以被復用。
操作數棧
操作數棧也被稱為操作棧,是一個先入后出的棧。Java虛擬機的解釋執行引擎被稱為”基于棧的執行引擎“,這里的棧指的就是操作數棧。操作數棧的最大深度在Javac編譯器編譯時便確定了,并寫入到Code屬性的max_stacks數據項。當操作數棧的元素是long或double的時候,那么一個數據占用兩個棧容量。Javac編譯器的數據流分析工作保證了方法在執行的時候,任何是首操作數棧的深度都不會超過max_stacks的值。操作數棧中的數據類型必須與字節碼指令的序列嚴格匹配。
在大多數的虛擬機的實現中,會對棧幀作出一些優化:讓下面棧幀的部分操作數棧與上面棧幀的局部變量部分重疊在一起,以節約空間并且在進行方法調用時就可以直接共用一部分數據,無須額外的參數復制傳遞。
動態連接
每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用,就是為了支持方法調用過程中的動態連接。
動態連接是指Calss文件常量池中的不在類加載階段和不在第一次使用就轉換為直接引用的符號引用,而是在每一次運行期間都轉換為直接引用。
方法返回地址
方法在退出的時候,需要返回到最初被調用的位置,程序才能繼續執行,方法返回時可能需要在棧幀中保存一些信息,用來幫助恢復它上層主調方法的執行狀態。一般來說法方法正常推出時,主調方法的PC計數器的值可以作為方法返回地址。而方法異常退出時,返回地址是通過異常處理表來確定的,棧幀中不會保存這部分信息。
關于退出,即推出方法的方式,可以分為“正常調用完成”和”異常調用完成“。正常調用完成指的時執行引擎遇到一個方法返回的字節碼指令,退出方法。這里的方法字節碼返回指令決定了方法返回是否有返回值傳遞給上層的方法調用者。異常調用完成指的是方法在執行過程中遇到異常(JVM內部產生的、代碼中athrow指令禪寺的),只要在本方法的異常表中沒有匹配的異常處理器,就會導致方法退出。
方法的退出等同于當前棧幀的出棧,所以可能存在的操作有:1.恢復上層方法的局部變量表和操作數棧 2若有返回值,將返回值壓入到調用者棧幀的操作數棧中 3調整PC計數器的值以指向方法調用指令后面的一條指令等。
附加信息
一些《JVM規范》中沒有描述的信息,例如與調試、性能收集有關的信息。
—
ubuntu系統弄得,不知道為什么格式不對
總結
以上是生活随笔為你收集整理的JVM007_运行时栈帧结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基本类型理解巩固及补码原理总结
- 下一篇: account表里有什么 银行_模拟一个