虛擬機器 3 執行

2021-09-01 09:31:48 字數 1330 閱讀 4451

位元組碼已經載入進來,肯定是你new了它,或者其他情況觸發了它的載入。

打比如new了它,也就載入、鏈結(驗證、準備、解析)、初始化了。再接著就是例項化。例項化,這個過程是啥,就是執行。這過程涉及到啥?怎麼樣把位元組碼轉化成機器碼(裝置可識別**)?

虛擬機器抽象定義,new這個操作就是乙個棧幀,平時列印異常,記得不,e.printstack(異常列印的就是每個棧幀)。那其實就是乙個乙個的單元。按方法設計。理解每個方法,那就是理解全部。

方法裡面又是怎麼玩?二進位制檔案(位元組碼)那會,又棧的深度,區域性變數個數,linetablename(源**和位元組碼的對應關係),基本就說出來了。區域性變數表(最小單位slot槽),方法棧(存的也是即將要用的數值),程式計數器(**執行到第幾行,偏移位址),還有返回位址(執行完這個方法回到**去,肯定是別人呼叫了這方法才執行啊);

由上面,看到main方法,顯示

先建立乙個物件,並將其引用值(對應堆裡面的首位址)存到棧頂,

取棧頂值,並把它返回給棧頂

invokespecial虛擬機器裡方法呼叫指令,這個是呼叫建構函式,編譯器就儲存了指定的類與方法描述符

以上就new xiaoqiang()

把常量推送至棧頂

虛函式呼叫,這裡是靜態繫結,編譯器就識別setname("******")

返回上面講了這麼多。就是方法與方法直接的呼叫,助記符的執行,還有很多概念沒涉及到。

比如1、區域性變數表,這裡除了this,沒有其他區域性變數表,故local:1;其他比如助記符isotre_1就是把棧頂常量存入區域性變數表。

2、方法呼叫指令invokespecial(構造),invokeinte***ce(介面),invokeviture(重寫過載,常規的也是),invokestatic(靜態)

新增invokedynamic,呼叫了methodhandler,方法的歸屬交給**編寫者決定。

3、方法繫結,編譯期確定,執行期確定,**敲寫確定

編譯器確定通過類符號和方法符號,及描述符號確定

執行期確定,通過優化手段方法表,也就是每個方法的索引;

以上的每一行助記符都是我自己大腦識別,機器呢?

虛擬機器有兩種辦法,解釋執行和編譯執行;解釋把位元組碼一行一行的code解釋成機器碼;編譯執行,把位元組碼統統一次性編譯成機器碼。虛擬機器採用了結合兩種方式的優劣,一起幹。經常性執行**,直接編譯成機器碼。不經常用的,解釋執行。解釋執行,可以結合執行時資訊,靈活優化。怎麼區分經常性執行與非經常性識別呢?專業術語,熱點**,常用計數方式識別。

編譯器好幾個。不同編譯器優劣不同。有注重啟動快速,執行消峰等。

虛擬機器下貌似真的不能執行虛擬機器

經過一翻摸索,用od載入bin vmware vmx.exe檔案,找到了關鍵跳轉處 crack後,那個提示倒是沒有了,但虛擬機器的執行畫面黑屏,看來真的是不行了 vmware.com官方還有乙個dll檔案可以檢測當前環境是否是虛擬機器環境,在cmd下執行rundll32 gwinstutil.dll...

虛擬機器位元組碼執行引擎

1.概述 虛擬機器 是乙個相對於 物理機 的概念,這兩種機器都有 執行能力,其區別是物理機的執行引擎是直接建立在處理器 硬體 指令集和作業系統層面上的,而虛擬機器的執行引擎是自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執行那些不被硬體直接支援的指令集格式。2.執行時棧幀結構 棧幀...

安裝和執行(含虛擬機器)

配置 解壓後把bin資料夾設定成環境變數,然後在一級檔案裡新增乙個my.ini,和新建乙個data資料夾,配置內容如下 mysql 設定mysql客戶端預設字符集 default character set utf8 mysqld 設定3306埠 port 3306 設定mysql的安裝目錄 bas...