10 位元組碼指令簡介
大部分指令不支援byte、char、short(轉為int處理) 所有指令不支援boolean(轉為int處理)
可按用途分為9類:
1. 載入和儲存指令
將一個區域性變數載入到操作棧:iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n> 將一個數值從運算元棧儲存到區域性變量表:istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n> 將一個常量載入到運算元棧:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d> 擴充區域性變量表的訪問索引:wide 運算元棧和區域性變量表主要由載入和儲存指令操作2. 運算指令
3. 型別轉換指令
4. 物件建立與訪問指令
建立類例項的指令:new 建立陣列的指令:newarray、anewarray、multianewarray 訪問類欄位(static欄位)和例項欄位(非static欄位)的指令:getfield、putfield、getstatic、putstatic 把一個數組元素載入到運算元棧的指令:baload、caload、saload、iaload、laload、faload、daload、aaload 將一個運算元棧的值儲存到陣列元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore 取陣列長度的指令:arraylength 檢查類例項型別的指令:instanceof、checkcast5. 運算元棧管理指令
6. 控制轉移指令
從概念模型理解,有條件或無條件的修改PC暫存器的值 條件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_acmpeq和if_acmpne 複合條件分支:tableswitch、lookupswitch 無條件分支:goto、goto_w、jsr、jsr_w、ret7. 方法呼叫和返回指令
方法呼叫指令與資料型別無關 invokevirtual,用於呼叫物件的例項方法,根據物件的實際型別進行分派(虛方法分派),Java語言中最常見的方法分派方式 invokeinterface,用於呼叫介面方法,它會在執行時搜尋一個實現了這個介面方法的物件,找出適合的方法進行呼叫 invokespecial,用於呼叫一些需要特殊處理的例項方法,包括例項初始化方法、私有方法和父類方法 invokestatic,用於呼叫類方法(static方法) invokedynamic,用於在執行時動態解析出呼叫點限定符所引用的方法,並執行該方法 前面4條呼叫指令分派邏輯固化在Java虛擬機器內部,invokedynamic指令分派邏輯是由使用者所設定的引導方法決定 方法返回指令是根據返回值型別區分 包括,ireturn(返回值是boolean、byte、char、short和int型別)、lreturn、freturn、dreturn、areturn return,供宣告為void的方法、例項初始化方法及類和介面的類初始化方法使用8. 異常處理指令
顯示丟擲異常的操作:athrow9. 同步指令
monitorenter、monitorexit Java虛擬機器支援方法級同步和方法內部一段指令序列同步,兩種同步結構都使用管程(Monitor)支援實現 方法級同步(方法同步的底層實現原理): 隱式的,即無須通過位元組碼指令控制,實現在方法呼叫和返回操作之中 虛擬機器可通過方法常量池中方法表結構的ACC_SYNCHRONIZED訪問標誌得知方法是否被宣告為同步方法 方法呼叫時,呼叫指令檢查ACC_SYNCHRONIZED訪問標誌是否被設定,若是,則執行執行緒要求先成功持有管程,然後才執行方法,方法完成(包括正常、非正常完成)時釋放管程 方法執行期間,執行執行緒持有了管程,其他執行緒無法再獲取同一個管程 若同步方法執行期間丟擲異常,且方法內部無法處理此異常,則同步方法持有的管程在異常丟擲同步方法時自動釋放 同步一段指令集序列(synchronized語句塊的底層實現原理): 由Java語言synchronized語句塊表示 指令集中monitorenter、monitorexit支援synchronized關鍵字語義 正確實現synchronized關鍵字需要Javac編譯器與Java虛擬機器兩者共同協作支援 編譯器必須確保,無論方法以何種方式(正常結束、異常結束)完成,方法中呼叫的每條monitorenter指令都必須執行其對應的monitorexit指令 為保證方法異常完成時monitorenter和monitorexit指令依然可以正確配對執行,編譯器自動產生一個異常處理器,該異常處理器宣告可處理所有的常,其目的是用執行monitorexit指令 管程(Monitor)的概念:相關推薦
10 位元組碼指令簡介
《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》6.4節 長度:1個位元組 總數:<=256 面向:運算元棧,而非暫存器 對齊:運算元長度不對齊 操作碼助記符:i代表int,l代表long,s代表short,b代表byte,c代表char,f代表fl
深入理解java虛擬機器(六)位元組碼指令簡介
Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、
深入理解JVM虛擬機器(五):位元組碼指令簡介
Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼)以及跟隨其後的零至多個代表此操作所需引數(運算元)而構成。由於 Java 虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數的指令都不包含運算元,只有一個操作碼。 1. 位元組碼與資料型別
位元組碼指令簡介
摘自《深入理解 Java 虛擬機器:JVM 高階特性與最佳實踐》(第二版) Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼,Opcode)以及跟隨其後的零至多個代表此操作所需引數(稱為運算元,Operands)而構成。由
JVM之位元組碼指令簡介
java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字以及跟隨其後的零至多個代表此操作所需的引數而構成的。 位元組碼與資料型別 載入和儲存指令: 將資料在棧幀中的區域性變量表和運算元棧
位元組碼指令簡介。
Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼,Pocode)以及跟隨其後的零至多個代表此操作所需引數(稱為運算元,Operands)而構成。由於Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數的指令都不包含
[四] java虛擬機器JVM編譯器編譯程式碼簡介 位元組碼指令例項 程式碼到底編譯成了什麼形式
public static void main(String[] args) { boolean bNum = true; char cNum = 2; byte byteNum = 127; short sNum = 32767; int iNum = 100; long lNum =
JVM位元組碼指令集簡介
Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(Opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(Operands)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那 Java 虛擬機器的直譯器使用下
Oracle數據庫代碼指令簡介
ever others ref shu varchar2 extend manage 20M 函數計算 這是oracle的課後作業,弄懂這些也差不多了吧,不懂的可以去看我的SQL sever數據庫的博客那個寫的詳細。視頻以後有時間錄~ 登錄數據庫 //方法一 s
JVM總括三-位元組碼、位元組碼指令、JIT編譯執行
JVM總括三-位元組碼、位元組碼指令、JIT編譯執行 java檔案編譯後的class檔案,java跨平臺的中間層,JVM通過對位元組碼的解釋執行(執行模式,還有JIT編譯執行,下面講解),遮蔽對作業系統的依賴。一個位元組(8位)可以儲存256中不同的指令,這樣的指令就是位元組碼,ja
大話+圖說:Java位元組碼指令——只為讓你懂
前言 隨著Java開發技術不斷被推到新的高度,對於Java程式設計師來講越來越需要具備對更深入的基礎性技術的理解,比如Java位元組碼指令。不然,可能很難深入理解一些時下的新框架、新技術,盲目一味追新也會越來越感乏力。 本文既不求照本宣科,亦不求炫技或著文立說,僅力圖以最簡明、最形象生動的方式,結合例子與
JVM 虛擬機器位元組碼指令表
把JVM虛擬機器位元組指令表整理了一下,方便搜尋,偶爾複習下 純手工整理,可能存在一些問題,如果發現請及時告之我會修正 位元組碼 助記符 指令含義 0x00 nop None 0x01
class檔案結構與jvm位元組碼指令
https://blog.csdn.net/luckydog1991/article/details/51654964這篇文章詳細的介紹了class檔案和位元組碼指令 Class檔案結構 https://blog.csdn.net/tyrone1979/article/details/9
Java位元組碼指令收集大全
Java位元組碼指令大全 常量入棧指令 指令碼 操作碼(助記符) 運算元 描述(棧指運算元棧) 0x01 aconst_null
Java位元組碼詳解(三)位元組碼指令(轉)
一、概述 Java虛擬機器採用基於棧的架構,其指令由操作碼和運算元組成。 操作碼:一個位元組長度(0~255),意味著指令集的操作碼個數不能操作256條。 運算元:一條指令可以有零或者多個運算元,且運算元可以是1個或者多個位元組。編譯後的程式碼沒有采用運算元長
JVM學習筆記1:位元組碼指令集
一.位元組碼指令集簡介: Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(operand)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那麼java虛
[三] java虛擬機器 JVM位元組碼 指令集 bytecode 操作碼 指令分類用法 助記符
上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot 其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資
JVM九:class位元組碼指令集
一:位元組碼與資料型別 Java虛擬機器的指令由一個位元組長度,代表著某種特定操作含義的數字(稱為操作碼)以及跟其隨後的零至多個代表此操作所需引數(稱為運算元)而構成。Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數指令都不包含運算元。因為位元
從位元組碼指令看重寫在JVM中的實現
Java是解釋執行的,包括動態連結的特性,都給解析或執行期間提供了很多靈活擴充套件的空間。面嚮物件語言的繼承、封裝和多型的特性,在JVM中是怎樣進行編譯、解析,以及通過位元組碼指令如何確定方法呼叫的版本是本文如下要探討的主要內容,全文圍繞一個多型的簡單舉例來
Python 2.6.2的位元組碼指令集一覽
對Python的位元組碼指令集感興趣但不知道從何下手麼?執行這段程式碼就能看到位元組碼的列表: Python程式碼 import opcode for op in range(len(opcode.opname)): print('0x%.2X(%