每日一面——談談你對棧幀的理解

菜雞每日一面系列打卡32

每天一道面試題目 

助力小夥伴輕鬆拿offer

堅持就是勝利,我們一起努力!

題目描述

談談你對棧幀的理解。

題目分析

你是否有這種困惑,當熟練地回答出面試官有關運行數據區的提問之後,卻在進一步的提問中敗下陣來。

相比其他運行時數據區,面試官似乎(事實上確實如此)對堆和棧更加感興趣。關於堆的進一步拓展提問就是我們曾提到的垃圾回收和內存管理相關的知識。而關於棧的拓展提問,最常見的就是對棧幀這種數據結構的理解。

本文將集中針對棧幀這種數據結構進行總結。接下來,隨菜雞一起去看看吧。

題目解答

01

棧幀的簡介

棧幀是JVM運行時數據區中的虛擬機棧的棧元素,它存儲了方法的局部變量表、操作數棧、動態連接和方法返回地址等信息。是不是很眼熟?其實這些信息在之前有關類文件結構的文章中有對應的結構。對類文件結構還不清楚的小夥伴可以移步文末的相關鏈接進行學習。

如果你寫過Java代碼,那麼你就會很自然地理解,JVM是以方法作爲最基本的執行單元。而“棧幀”則是用於支持JVM進行方法調用和方法執行的數據結構。每一個方法從調用開始至執行結束的過程,都對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。每一個棧幀都包括了局部變量表、操作數棧、動態連接、方法返回地址和一些額外的附加信息。一個線程中的方法調用鏈可能會很長,但只有位於棧頂的方法纔是在運行中的,只有位於棧頂的棧幀纔是生效的,其被稱爲“當前棧幀”,與之關聯的方法被稱爲“當前方法”。

接下來,讓我們來看看棧幀中每部分內容的作用。

02

棧幀的結構

上文中我們已經提到,棧幀存儲了局部變量表、操作數棧、動態連接、方法返回地址和一些額外的附加信息。我們逐一來看。

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

  • 操作數棧:操作數棧,顧名思義,它是一個FILO棧,用於存放方法執行過程中的操作數。操作數棧的元素是任意Java數據類型。方法的執行過程伴隨着操作數入棧和出棧的過程。

  • 動態連接:每個棧幀都包含一個指向其所屬方法的引用,以支持方法調用過程中的動態連接。菜雞在之前的相關文章中曾提到過,方法調用指令的符號引用參數最終都會轉化爲直接引用。其中,一部分會在類加載階段或者第一次使用的時候轉化爲直接引用,稱爲靜態解析;另一部分將在運行時轉化爲直接引用,稱爲動態連接

  • 方法返回地址:方法退出可以分爲正常調用完成異常調用完成兩種方式。

    • 正常調用完成:遇到方法返回的字節碼指令而退出。一個方法使用正常調用完成的方式退出,可能會有返回值傳遞給上層方法調用者(調用當前方法的方法稱爲調用者或者主調方法),方法是否有返回值以及返回值的類型由具體執行的返回指令決定。

    • 異常調用完成:無論是JVM內部異常,還是代碼層的異常,只要在本方法的異常表中沒有搜索到匹配的異常處理器,就會導致方法退出。一個方法使用異常調用完成的方式退出,不會給它的上層調用者提供任何返回值。

      無論採用何種方式退出,都必須返回一開始方法被調用時的位置。只有這樣,程序才能繼續執行。方法返回時可能需要在棧幀中保存一些信息,用來幫助恢復它的上層主調方法的執行狀態。

      一般來說,方法正常調用完成時,主調方法的程序計數器的值就可以作爲返回地址,棧幀中很可能會保存這個計數器值。而方法異常調用完成時,返回地址是通過異常處理器表來確定的,棧幀中一般不會保存這部分信息。

      方法退出的過程實際上等同於把當前棧幀出棧,因此退出時可能執行的操作有:恢復上層方法的局部變量表和操作數棧,把返回值(如果有的話)壓入調用者棧幀的操作數棧中,調整程序計數器的值以指向方法調用指令後面的一條指令等。

  • 附加信息:Java虛擬機規範》允許具體的虛擬機實現在棧幀中增加一些規範中沒有的內容,例如與調試、性能收集相關的信息等。

03

棧幀的總結

看到這裏,小夥伴們應該對棧幀有了更加細緻全面的認識。菜雞一直篤信,任何事物,只有掌握了其底層原理,才能真正達到運用自如。具體到本文來說,只有瞭解了棧幀的具體內容及其作用,才能對方法調用過程有更加深刻的認識。

總而言之,棧幀是用於支持JVM進行方法調用和方法執行的數據結構。每一個方法從調用開始至執行結束的過程,都對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。而每一個棧幀中的具體內容,都是爲了保證方法的正常調用、執行和返回。

寫了這麼多面試題,菜雞想說,學習是一個長久的過程,抱着追根究底的態度去學習,面試只是水到渠成的事。

以上便是菜雞對棧幀的一些總結,供大家參考。

參考資料

《深入理解Java虛擬機》第3版 周志明

相關鏈接

每日一面——談談你對JVM的運行時數據區的理解

每日一面——你對Class文件瞭解多少?

每日一面——談談你對類加載機制的理解

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

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