爲什麼JVM局部變量表的一個slot至少要能容納一個int類型的變量

實際上操作數棧的最小單位也是能容納一個int變量。那麼使用boolean,byte,char和short這些類型的時候就只能浪費一些空間了,爲什麼要做這樣的設計呢?!

原因很簡單,大部分JVM字節碼指令都沒有支持boolean,byte,char和short類型,在處理這些類型的數據時,都是使用int類型的相關指令。舉例說,load/store指令都只有iload,istore,把一個byte類型的局部變量load到操作數棧頂時,需要使用iload指令,如果操作數棧和局部變量表使用1byte空間存儲該變量就會出錯了。

Java語言被創造出來的時候顯然受到了SUN公司自己的SPARC精簡指令集的設計影響,同時也爲了滿足在網絡上傳輸代碼的需求,Java虛擬機的字節碼指令被限定爲一個字節,因此操作碼總數不能超過256個,這迫使字節碼指令只能選擇支持一部分數據類型。這個設計上的選擇帶來了一些side effect,其中就包括局部變量表和操作數棧的slot大小。由於字節碼中已經不包含原來的byte,short一類的類型信息了,JIT編譯之後執行的機器碼也不可能在存儲空間上有任何優化。

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