虛擬機棧

什麼是虛擬機棧

虛擬機棧是用於描述java方法執行的內存模型。

特點

  • 虛擬機棧是一個後入先處的棧
  • 虛擬機棧是線程私有的
  • 虛擬機棧的生命週期與線程同進退

什麼是棧幀

棧幀(stack frame) 是用於支持虛擬機進行方法調用和方法執行的數據結構,它是虛擬機運行時數據區中的虛擬機棧的棧元素,存儲着局部變量表操作數棧動態鏈接方法出口等信息

線程每調用一個方法,就會爲該方法創建一個棧幀,並將棧幀 push到虛擬機棧中;在活動線程中,只有位於棧頂的幀纔是有效的,稱爲當前棧幀;正在執行的方法稱爲當前方法

每一個方法從調用開始到執行完成的過程,就對應着一個棧幀在虛擬機棧裏面從入棧到出棧的過程。

方法調用流程

方法調用時,創建棧幀,並壓入虛擬機棧;方法執行完畢,棧幀出棧並被銷燬,如下圖所示:
在這裏插入圖片描述

局部變量表

局部變量表是一組局部變量值存儲空間,用於存放方法參數和方法內部定義的局部變量

  • 局部變量表的創建是在方法被執行的時候,隨着棧幀的創建而創建.
  • 在 Java 程序編譯爲 Class 文件時,就在方法的 Code 屬性的 max_locals 數據項中確定了該方法所需要分配的局部變量表的最大容量。

局部變量表的容量以**變量槽(Variable Slot,下稱 Slot)**爲最小單位。 Slot是可以重用的,當Slot中的變量超出了作用域,那麼下一次分配Slot的時候,將會覆蓋原來的數據。Slot對對象的引用會影響GC(要是被引用,將不會被回收)。

操作數棧

操作數棧也常被稱爲操作棧或者說是表達式棧它是一個後入先出棧。Java虛擬機的解釋執行引擎被稱爲"基於棧的執行引擎",其中所指的棧就是指操作數棧

JVM底層字節碼指令集是基於棧類型的,所有的操作碼都是對操作數棧上的數據進行操作,對於每一個方法的調用,JVM會建立一個操作數棧,以供計算使用。

動態鏈接

Class文件的常量池中存在有大量的符號引用,字節碼中的方法調用指令就以指向常量池的引用作爲參數

  • 部分符號引用在類加載階段(解析)的時候就轉化爲直接引用,這種轉化爲靜態鏈接
  • 部分符號引用在運行期間轉化爲直接引用,這種轉化爲動態鏈接

虛/非虛方法

參考文章:JVM-虛擬機棧之動態鏈接

個人認爲這個就是說的後期綁定;只有在運行調用的時候才能知道調用那個方法。

方法出口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章