字節碼指令大致分為九類:
一:加載和存儲指令用于將數據在棧幀中的局部變量表和操作數棧之間來回傳輸
二:算術指令用于對兩個操作數棧上的值進行某種特定運算,并把結果重新存入到操作棧頂。運算指令可以分為兩種:對整型數據進行運算的指令與對浮點型數據進行運算的指令;無論是哪種算術指令,均是使用Java虛擬機的算術類型來進行計算的,換句話說是不存在直接支持byte、short、char和boolean類型的算術指令,對于上述幾種數據的運算,應使用操作int類型的指令代替
三:類型轉換指令可以將兩種不同的數值類型相互轉換,這些轉換操作一般用于實現用戶代碼中的顯式類型轉換操作,或用來處理字節碼指令集中數據類型相關指令無法與數據類型一一對應的問題
小范圍向大范圍安全轉換,窄化類型轉換必須顯示的使用轉換指令,即強轉
四:對象創建與訪問指令,類實例和數組的創建與操作使用了不同的字節碼指令。對象創建后,就可以通過對象訪問指令獲取對象實例或者數組實例中的字段或者數組元素(創建類實例、創建數組、訪問類字段(static字段,或者稱為類變量)和實例字段、把一個數組元素加載到操作數棧、將一個操作數棧的值儲存到數組元素、取數組長度、檢查類實例類型等指令)
五:操作數棧管理指令,用于直接操作操作數棧的指令(將操作數棧的棧頂一個或兩個元素出棧、將棧最頂端的兩個數值互換等指令)
六:控制轉移指令可以讓Java虛擬機有條件或無條件地從指定位置指令(而不是控制轉移指令)的下一條指令繼續執行程序(條件分支、復合條件分支、無條件分支)
七:方法調用和返回指令;方法調用指令與數據類型無關,而方法返回指令是根據返回值的類型區分的,包括ireturn(當返回值是boolean、byte、char、short和int類型時使用)、lreturn、freturn、dreturn和areturn,另外還有一條return指令供聲明為void的方法、實例初始化方法、類和接口的類初始化方法使用
八:異常處理指令,顯式拋出異常的操作;處理異常(catch語句)不是由字節碼指令來實現的而是采用異常表來完成
九:同步指令,Java虛擬機可以支持方法級的同步和方法內部一段指令序列的同步,都使用管程(就是“鎖”)實現;方法級的同步是隱式的,無須通過字節碼指令來控制,它實現在方法調用和返回操作之中;同步一段指令集序列通常是由Java語言中的synchronized語句塊來表示的,Java虛擬機的指令集中有monitorenter和monitorexit兩條指令來支持synchronized關鍵字的語義,正確實現synchronized關鍵字需要Javac編譯器與Java虛擬機兩者共同協作支持