我所理解的JVM(三) 位元組碼的執行

2021-09-24 12:09:43 字數 1540 閱讀 5697

2019獨角獸企業重金招聘python工程師標準》

jvm棧是由棧幀組成的,乙個方法對應乙個棧幀,方法執行完後彈棧。

執行時棧幀結構:棧幀是jvm棧(stack)中的基本單元,是方法呼叫和執行的資料結構。

每乙個棧幀(frame)內部儲存有方法的區域性變數表(localvariables)、運算元棧(operandstack)、動態連線(currentclassconstantpoolreference)、方法返回位址(returnvalue)和一些額外的附加資訊。這些資料在class檔案中已確定,所以每個棧幀的記憶體大小不受執行期資料變化的影響。

區域性變數表(localvariables)

區域性變數表存放方法中用到的8中基本資料型別的值以及物件的引用。物件的引用有兩個功能:1,在堆中能找到實際的物件;2,在方法去的中能找到該物件的型別資訊。 注意:區域性變數必須顯式的賦初始值,虛擬機器不會對區域性變數賦預設值。編譯器可以檢測這點錯誤。

運算元棧(operandstack)

存放位元組碼指令。**先出。剛開始執行方法時棧內元素為空。運算元棧的大小在class檔案中已確定。

動態連線(currentclassconstantpoolreference) 編譯後的class檔案只有符號引用。執行期才能獲取實際的引用或控制代碼。

方法返回位址(returnvalue)

附加資訊虛擬機器規範允許具體的虛擬機器實現增加一些規範裡沒有描述的資訊到棧幀之中。

方法呼叫

方法呼叫應不等於方法執行,方法呼叫階段唯一的任務就是確定呼叫哪個方法,不涉及方法的具體執行。 比如,呼叫某個介面實現類的某個介面方法,需要在執行期找到介面的具體實現類的這個方法的具體實現。(動態分派)

解析呼叫是乙個靜態過程,在編譯期間就已完全確定,類載入階段確定靜態方法和私有方法的符號引用轉直接引用,在呼叫時確定其他方法的符號引用轉直接引用。

靜態分派: 所有依賴靜態型別來定位方法執行版本的分派動作成為靜態分派,典型應用比如引數型別為子類和父類的方法過載。 father f = new son(). 有兩個過載方法 test(father father) test(son son),在執行test(f)的時候,編譯器就已知是呼叫的前者,這種定位稱為靜態分派。

動態分派: father f = new son() father有個方法test(),son重寫了這個test()方法,這呼叫f.test()的時候定位到後者,這種定位稱為動態分派。

單分派和多分派: 同時根據呼叫者的物件型別和方法引數來定位方法。

方法執行: 在operatedstatck中執行方法方法呼叫階段定位的區methodcode中的指令集

附上網上找的一張圖,經典:

Socket的學習(三)位元組序相關

一 大端和小端 這裡有一篇很好的文章 通常乙個位元組等於8位,對於乙個八位的系統,從來就不會出現大端和小端的問題。但是對於超過八位的系統,那麼就會存在乙個,如何將資料在記憶體中存放的問題。以乙個0x1123例,0x11是這個要儲存資料的高位,0x23要儲存資料的低位。對於大端系統,高位放低位,低位放...

我的pythonx學習筆記(三) 字典

字典 python 中的字典是一種對映型別資料,裡面的資料是鍵值對,python中的字典是基於hash實現的。建立字典 3種構造字典的方 a a a dict x 1 y 2 a fromkeys x y 4 字典是無序的,hash表的實現也是無序的 訪問字典的元素 print a x 往字典中插入...

我所理解的水煮三國

前段時間,讀了成君憶的水煮三國,有一種說不出暢快感,新穎,風趣,而又不缺妙論。這本書是把三國中的人物串聯到現實營銷管理學裡,把三國中的智慧型和道理一一展現在我們的面前。將難懂的營銷管理學以一種非常特別的方式呈現出來,易於理解。讓和尚買梳子 你的創業信條決定了你的命運,既然你信奉商業欺詐,既然你選擇了...