Java字節碼揭祕——第二部分

 
Java字節碼分類
JVM字節碼集合基本上是分爲幾個不同的大類的。我們不會逐一介紹字節碼的操作符,我們討論類別,然後着重拿出一些常用的操作符,其餘的均可通過JVM規範來獲取詳情。
 
堆棧操作。
  • poppop2:將堆棧的值彈出。pop2用來彈出64位的值,pop用來彈出32位的。
  • dupdup2:複製堆棧頂端的值。用來形成高效的pop/push/push組合。dup2也是用在64位上的。
  • const_nullnull的引用推送至堆棧。
  • bipush將單字節的常量值(-127~128)推送至堆棧。
  • sipush將一個短整型類型的常量值(-32K~32K)推送至堆棧。
  • ldc將常量值從常量池中推送至堆棧。
  • XloadX可爲adfl或者i,是將一個本地(參數或變量)的指定類型推送至堆棧。a指引用、b指布爾類型、c指字符、d指雙精度類型、f指浮點類型、i指整型、l指長整型、s指短整型。該編碼模式會在操作符的名字中重複出現。
  • XstoreX可爲adfl或者i,將堆棧頂端的值彈出並放入本地分片中。
  • Xconst_Y是操作符集合中一系列的優化操作,設計用來將X類型的常量Y值推送至堆棧。例如,iconst_0就是將整數常量0推送至堆棧中,是bipush的高效硬編碼變種。
 
分支與控制流。
  • nop,啥也不做。
  • if(條件),條件可以是nullnotnulleqnegtlt_icmpeq_icmpne……。
  • gotoJava代碼雖然不支持goto,但JVM是支持的。
  • returnXreturnX可以爲adfl或者i,從當前調用方返回,將堆棧頂端作爲X類型返回。
  • lookupswitch提供了對switch/case表的實現。
 
算法指令。JVM操作符合其他CPU指令集一樣有一些基本的算術運算符,例如加減乘除等,也包含一些基本的轉換操作符進行放大與縮小的轉換:
  • 數據轉換操作符采用XtoY的形式,XY可以是adfl或者i,堆棧的頂端取符合X格式的數,並將轉換成Y格式後推送回堆棧。
  • 算術運算符采用XOP的格式,X可爲dfi或者lOP可爲加減乘除和取餘。
  • 字節操作符采用iOP的格式,OP可爲與、或、異或、左移位(shift left)、右移位(shift right)
  • 比較操作符采用XcmpY的格式,X可以是d,即基於雙精度的比較;f,即基於浮點的比較;或l,即基於長整型的比較。Y可以是g或者l。兩個數比較,第一個>第二個,則將1推送至堆棧;如果=,則推送0;如果<,則推送-1
 
對象模型指令。JVM內置的專門爲對象工作的操作符:創建對象、調用方法、訪問屬性等:
  • newnewarrayanewarray:創建一個新對象、創建一個數組和創建一個對象應用的數組。對象或數組被推送至堆棧的頂端。在new操作符時,並未調用構造函數,調用構造函數是後續代碼的工作。
  • getfieldsetfieldgetstaticsetstatic。在設置值時,值在堆棧的頂端,而對象引用就正好在下方跟着。如果是靜態屬性的話,顯然不需要任何對象引用。
  • invokevirtualinvokestaticinvokespecialinvokeinterface。它們都是調用方法的操作符,方法則由操作計數指定的常量池入口描述。使用推送至堆棧的值作爲由左至右的調用參數,即調用的第一個參數位於堆棧的最下部;this引用位於第一個,也就是在堆棧的最下部引用。Invokevirtual操作符表示調用是對對象方法的普通調用,invokeinterface就是當通過接口的引用調用方法時,invokestatic表示調用靜態方法,invokespecial表明無需考慮動態綁定的方法調用——爲了調用特定版本的類的方法,而不管衍生覆蓋類型。
  • castclassinstanceof。這兩個操作符處理堆棧頂部的引用轉換爲操作計數隱含的類型。如果成功,新引用或true將被推送至堆棧頂端,如果失敗,則CastClassException異常或false被推送。
 
塊同步(同步塊或方法)塊同步由兩個操作符處理,monitorentermonitorexit。當調用對象試圖獲取監控器的代碼時,它們都在堆棧上分別持有該對象的引用。事實上是編譯器負責保證均衡的出入口調用,所以同步方法或同步塊通常需要在try/finally塊中來保證monitorexit操作符一定會被調用。如果不這樣做的話,就會讓監控器一直被線程佔有,最終導致死鎖。
 
異常處理。異常處理並非通過特殊的操作符集合來處理,而是通過創建一個表格,裏面標記了塊指令——監視並創建一系列的包括需要做什麼的入口,也即當特定類型的異常拋出後的操作符偏移量。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章