1. 程式人生 > 實用技巧 >JVM08_方法的重寫、棧幀之方法返回地址和一些附加資訊、一些面試題

JVM08_方法的重寫、棧幀之方法返回地址和一些附加資訊、一些面試題

在這裡插入圖片描述

虛方法表

在這裡插入圖片描述
在這裡插入圖片描述
上例中,因為存在虛方法表,所以對於toString()\hashCode()這種方法,就不會再去Son的父類向上找,直接找的就是虛方法表中的方法入口,加快執行效率

方法返回地址

儲存的就是呼叫該方法的指令的下一條指令地址,也就是下一個方法或者棧幀。
這樣返回給呼叫者的PC暫存器,就知道下一條該執行那個指令了
在這裡插入圖片描述
在這裡插入圖片描述
方法執行後,退出方法的兩種情況:
1、正常完成出口 return
2、出現異常,會在異常處理表中找對應的處理異常的程式碼。如果異常表中沒有異常處理器,就會導致方法退出
這種是異常完成出口
也就是說,有異常處理器處理,那麼就會正常完成出口,return
在這裡插入圖片描述
在這裡插入圖片描述

一些附加資訊

例如提供程式除錯的一些資訊,瞭解即可

題目

1、舉例棧溢位的情況。
當在棧中壓入一個個棧幀,棧空間不足的時候就出現棧溢位(StackOverFlowError)
可以通過-Xss設定棧空間的大小。
如果申請棧空間的時候記憶體不足,這是會發生OOM

2、調整棧大小,就能保證不出現溢位嗎?
不能。增大棧空間,只是能保證溢位的概率降低或者溢位時間向後推移,並不能一定保證不溢位。
比如這個就是一個方法遞迴死迴圈,那必然棧溢位。

3、分配的棧記憶體越大越好嗎?
不是。1、棧記憶體越大隻是溢位時間推遲了。2、可能會擠佔其他棧或記憶體結構的空間

4、垃圾回收是否涉及虛擬機器棧?
不涉及 。既然是棧,就只有進棧出棧的操作,所以不存在GC,只可能出現Error,比如棧溢位Error

另外,本地方法棧一樣是有Error無GC,PC暫存器無Error無GC,方法區和堆既有Error也有GC

5、方法中定義的區域性變數是否執行緒安全?
首先關注的是這個區域性變數本身是否是執行緒安全的,如果是,那麼就一直安全

如果本身是執行緒不安全的,那麼如果是作為引數傳入,或者是直接作為結果返回,這樣都存在安全問題
如果是區域性變數在方法內,返回前就消亡了,那麼就是執行緒安全的。

補充:StringBuilder和StringBuffer的區別
StringBuilder是執行緒不安全的,StringBuffer因為方法都加了synchronized關鍵字,所以是執行緒安全的。
除此之外,二者沒有區別,都是繼承自AbstractStringBuilder類


在這裡插入圖片描述
在這裡插入圖片描述
最後一個StringBuilder例項的toString方法,返回的時候是重新new了一個String,也就意味著s1在方法內消亡了,所以是執行緒安全的
在這裡插入圖片描述