Java面試必備之JVM虛擬機棧

昨天跟大家聊過了關于JVM的程序計數器的細節實現。相比大家覺得程序計數器也不過如此吧。其實技術本無難點。故若高深也會讓人感覺虛無縹緲。落入實地其實也就了了。
那今天我們開始介紹JVM的第二個重要的組成部分——棧(JAVA STACK)。

Java面試必備之JVM虛擬機棧

是什么

棧是和線程一致的內存空間且線程私有。也就是說它的生命周期是和線程是一致的。當一個方法開始執行的時候會同事在棧空間里面創建一個棧幀【Stack Frame】來存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
每一個方法從調用直至執行完成的過程其實在棧中都是有一個對應的棧幀在虛擬機棧中同樣的入棧到出棧的過程。
棧的數據結構
局部變量表:中的局部變量表存放了編譯期可知的各種基本數據類型(boolean、char、short、int、float、long、double)注意:long和double是64位的長度,要占用2個局部變量空間。其余數據類型只要占用1個。

對象引用(reference類型,它不等同于對象本身,可能是一個指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或其他與此對象相關的位置)和returnAddress類型(指向了一條字節碼指令的地址)。

動態鏈接:在運行時創建的直接引用稱為動態鏈接。即程序在編譯成.class文件后會有一系列的引用。這些是靜態引用。而在運行時才創建的引用稱為動態引用。

方法出口:方法出口分為兩種。第一種方式是執行引擎遇到任意一個方法返回的字節碼指令,這時候可能會有返回值傳遞給上層的方法調用者;另外一種退出方式是,在方法執行過程中遇到了異常,并且這個異常沒有在方法體內得到處理,無論是Java虛擬機內部產生的異常,還是代碼中使用athrow字節碼指令產生的異常,只要在本方法的異常表中沒有搜索到匹配的異常處理器,就會導致方法退出。

棧的異常

如果線程請求的棧深度大于虛擬機所允許的深度。會拋出StackOverFlowError異常。

如果虛擬機棧擴展是無法申請到足夠的內存,就會拋出OutOfMemioryError異常

今天對于棧的分析就是以上的內容。以上內容其實還沒有深入到虛擬機中棧的數據結構的實現。但是對于了解JVM棧的結構和狀態已經是足夠滿足要求了。各位如果有補充的可以留言交流。也希望各位不吝賜教。今天的內容就到這里了。明天還有對于JVM的后續介紹。

我的文章每天都會在頭條號首發,然后第二天轉發到簡書中,希望有興趣的朋友可以關注我的頭條號:[Bug制造機]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)。謝謝大家的支持。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容