java虚拟机所支持的指令_JVM虚拟机指令
1概述
a虛擬機的指令由一個字節長度(意味著操作碼總數不能超過256條)、代表某種操作含義的數字(操作碼,Opcode)以及跟隨其后的0至多個代表此操作所需參數的操作數(operand)構成
b因為JVM采用面向操作數棧而不是面向寄存器的架構,所以大多數指令都不包含操作數,只有一個操作碼,指令參數都存放在操作數棧中
c操作數的數量以及長度取決于操作碼,如果一個操作數的長度超過了一個字節,那么它將會以高位在前(big-endian)順序存儲
d字節碼指令流是單字節對齊,只有lookupswitch 和 tableswitch例
e為了盡可能獲得短小精悍的編譯代碼,限制了JVM操作碼的長度為一字節,且放棄了編譯后代碼的參數長度對齊,但這樣會損失一些性能
f由于e的原因,JVM處理超過一個字節數據時,不得不在運行時從字節六中重建出具體數據結構,這又會浪費一些性能
g指令集被故意設計成非完全獨立,有一些單獨的指令可以在必要的時候用來將一些不支持的類型轉換為可支持類型(In other words, the instruction set is intentionally not orthogonal. Separate instructions can be used to convert between unsupported and supported data types as necessary)
2數據類型和JVM(Types and the Java Virtual Machine)
a大部分與數據類型有關的字節碼指令,都有特殊字符表明該指令服務哪個數據類型: i for an int operation, l for long, s for short, b for byte, c for char, f for float, d for double, and a for reference.
b JVM會在編譯期或運行期將byte和short類型的數據帶符號擴展(sign-extend)為相應的int類型數據,將boolean和char類型數據零位擴展(zero-extend)為相應的int數據
c 在處理boolean、byte、short和char類型的數組時,也會轉為使用對應的int類型字節碼
d JVM指令所支持的數據類型表
3、加載和存儲指令
a將一個本地變量加載到操作數棧的指令包括:iload, iload_, lload, lload_, fload, fload_, dload, dload_, aload, aload_
b將一個數值從操作數棧存儲到局部變量表的指令包括:istore, istore_, lstore, lstore_, fstore, fstore_, dstore, dstore_, astore, astore_.
c將一個常量加載到操作數棧的指令包括:bipush, sipush, ldc, ldc_w, ldc2_w, aconst_null, iconst_m1, iconst_, lconst_, fconst_, dconst_.
d將一用于擴充局部變量表的訪問索引或立即數的指令:wide
Gainaccesstomorelocalvariablesusingawiderindex,ortoalargerimmediate operand: wide.
e補充說明,非負整數,int,long,float,double
4算數指令
4.1概述
a JVM沒有明確規定整型數據一出情況,但在整數除法指令以及整數求余指令在除數為0時會拋出ArithmeticException
b JVM要求完全支持IEEE754定義的非標準浮點數值和逐級下溢(gradual underflow)
c對long進行比較,采用帶符號方式比較。對浮點類型數進行比較,采用IEEE754標準所定義的無信號比較方式(nonsignaling comparisons)
d把浮點型轉為整形數時,采用IEEE754標準的向零舍入模式(round towards zero mode)
e JVM在處理浮點數運算時,不會拋出任何JAVA異常。當一個操作向上溢出時,使用有符號的無窮大表示,當向下溢出時,產生非標準值或帶符號的0值。如果操作結果沒有明確數學定義,則用NaN值表示
f 各種類型的比較最終都會轉化為int類型比較。
4.2指令列表
a加法:iadd,ladd,fadd,dadd.
b 減法:isub,lsub,fsub,dsub.
c乘法:imul,lmul,fmul,dmul.
d除法:idiv,ldiv,fdiv,ddiv.
e求余:irem,lrem,frem,drem.
f求負值:ineg,lneg,fneg,dneg.
g移位:ishl,ishr,iushr,lshl,lshr,lushr.
h 按位或: ior, lor.
i按位與: iand, land.
j按位異或: ixor, lxor.
k局部變量自增:iinc
L 比較指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp
5類型轉換指令
5.1數值寬化轉換( widening numeric conversions,小范圍類型到大范圍類型的安全轉換)
a轉換類型:
a.1 int to long, float, or double
a.2 long to float or double
a.3 float to double
b寬化轉換指令:i2l, i2f, i2d, l2f, l2d, and f2d
c 從float到double轉換,在FP-strict模式下可以保證精確相等,否則不能保證。int到long、int到double能保證精確相等。
d從int或long到float、long到double時,可能會發生精度丟失
e寬化轉換雖然可能發生精度丟失,但不會導致JVM拋出異常
f從int到long轉換,是一個簡單的帶符號擴展操作,即把int數值的二進制補碼表示擴充至更寬的格式
g從char到一個整形轉換時一個零位擴展,即直接給char的二進制形式上填若干0,以填充成更寬的格式
h JVM直接支持轉換,不需要顯示轉換命令
5.2數值窄化轉換(narrowing numeric conversions)
a類型轉換
a.1 int to byte, short, or char
a.2 long to int
a.3 float to int or long
a.4 double to int, long, or float
b窄化轉換指令:i2b, i2c, i2s, l2i, f2i, f2l, d2i, d2l, and d2f
c因為窄化轉換可能會導致轉換結果具備不同的正負號、不同的數量級,因此會導致數值丟失精度
d從int或者long窄化轉換為整形T,轉過過程僅僅是簡單丟低除最低N個二進制以外的內容,這可能導致與原始值有不同符號
e將浮點類型窄化轉換為整數T(int或long)時:
e.1如果原始浮點值時NaN,則轉換結果都為0
e.2如果轉換結果v在T范圍內,則轉換結果值就為v
e.3如果轉換結果v超過T的范圍,則轉換結果值為T最大值
e.4如果轉換結果v低于T的范圍,則轉換結果值為T最小值
f從double轉為float的窄化轉換過程與IEEE754中定義一致:
f.1、通過向最近數舍入模式 舍入得到一個可以使用的float類型表示值
f.2、如果轉換結果太小,無法用float表示,則返回float類型的正負0;
f.3、如果轉換結果太大,則返回float類型的無窮大
f.4 、double的NaN值將轉為float的NaN值
g、JVM盡管可能發生上下限溢出或精度丟失等情況,但窄轉化永遠不會拋出運行時JAVA異常
6對象創建與訪問指令
a 創建類實例: new.
b 創建數組: newarray, anewarray, multianewarray.
c 訪問類字段和類實例字段: getstatic, putstatic, getfield, putfield.
d 把一個數組元素加載到操作數棧:baload,caload,saload,iaload, laload, faload, daload, aaload.
e 講一個操作數棧的值存儲到數組元素中: bastore, castore, sastore, iastore, lastore, fastore, dastore, aastore.
f 取數組長度: arraylength.
g 檢查類實例或數組類型: instanceof, checkcast.
7操作數棧管理指令
直接控制操作數棧:pop, pop2, dup, dup2, dup_x1, dup2_x1, dup_x2, dup2_x2, swap.
8控制轉移指令
a 控制轉移指令可以讓JVM從指定指令而不是控制轉移指令的下一條指令繼續執行程序(The control transfer instructions conditionally or unconditionally cause the Java Virtual Machine to continue execution with an instruction other than the one following the control transfer instruction)
b指令類型:
b.1條件分支: ifeq, ifne, iflt, ifle, ifgt, ifge, ifnull, ifnonnull, if_icmpeq, if_icmpne, if_icmplt, if_icmple, if_icmpgt if_icmpge, if_acmpeq, if_acmpne.
b.2復合條件分支: tableswitch, lookupswitch.
b.3無條件分支: goto, goto_w, jsr, jsr_w, ret.
c 所有int類型的條件分支轉移指令進行的都是有符號的比較操作(All int conditional control transfer instructions perform signed comparisons)
9方法調用和返回指令
9.1方法調用指令
a 指令invokevirtual用于調用對象的實例方法,根據對象的實際類型進行分派(虛方法分派)
b 指令invokeinterface用于調用接口方法,會在運行時搜索指定對象所實現的這個接口方法,并找出合適的方法進行調用
c 指令invokespecial 用于調用一些需要特殊處理的實例方法,包括實例初始化方法、私有方法、父類方法
d 指令invokestatic調用命名類中的類方法
e 指令invokedynamic用于調用以綁定了invokedynamic指令的調用點對象作為目標的方法(invokes the method which is the target of the call site object bound to the invokedynamic instruction)。每條invokedynamic都有獨一無二的連接狀態(each occurrence of an invokedynamic instruction has a unique linkage state, unlike the other instructions which invoke methods)
9.2方法返回指令
a 指令ireturn 用于返回boolean, byte, char, short, int類型
b 指令lreturn, freturn, dreturn, areturn返回對應類型的值
c 指令return為聲明為void的方法、實例初始化方法、類和接口的類初始化方法使用
10異常處理指令
a顯式異常拋出的操作都由athrow指令實現
b JVM中處理異常,近代JVM都是用異常表實現,很久之前用jsr和ret指令實現
11同步指令
a JVM支持方法級的同步和方法內部的一條短指令序列的同步,都是用同步鎖實現(monitor,管程,更常見被直接稱為鎖)支持。
b方法級的同步時隱式的,從方法的常量池中的方法表結構中的ACC_SYNCHRONIZED區分是否同步方法
c同步方法執行期間拋出異常,且方法內部無法處理時,方法所持有的鎖在異常拋到同步方法邊界之外時自動釋放
d指令monitorenter 和monitorexit 用來支持指令序列的同步(synchronized代碼塊)
總結
以上是生活随笔為你收集整理的java虚拟机所支持的指令_JVM虚拟机指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 时间l_java中获取系统时间
- 下一篇: mongodb java 学习_《 mo