java虚拟机所支持的指令_JVM虚拟机指令
1概述
a虛擬機的指令由一個字節(jié)長度(意味著操作碼總數(shù)不能超過256條)、代表某種操作含義的數(shù)字(操作碼,Opcode)以及跟隨其后的0至多個代表此操作所需參數(shù)的操作數(shù)(operand)構(gòu)成
b因為JVM采用面向操作數(shù)棧而不是面向寄存器的架構(gòu),所以大多數(shù)指令都不包含操作數(shù),只有一個操作碼,指令參數(shù)都存放在操作數(shù)棧中
c操作數(shù)的數(shù)量以及長度取決于操作碼,如果一個操作數(shù)的長度超過了一個字節(jié),那么它將會以高位在前(big-endian)順序存儲
d字節(jié)碼指令流是單字節(jié)對齊,只有l(wèi)ookupswitch 和 tableswitch例
e為了盡可能獲得短小精悍的編譯代碼,限制了JVM操作碼的長度為一字節(jié),且放棄了編譯后代碼的參數(shù)長度對齊,但這樣會損失一些性能
f由于e的原因,JVM處理超過一個字節(jié)數(shù)據(jù)時,不得不在運行時從字節(jié)六中重建出具體數(shù)據(jù)結(jié)構(gòu),這又會浪費一些性能
g指令集被故意設(shè)計成非完全獨立,有一些單獨的指令可以在必要的時候用來將一些不支持的類型轉(zhuǎn)換為可支持類型(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數(shù)據(jù)類型和JVM(Types and the Java Virtual Machine)
a大部分與數(shù)據(jù)類型有關(guān)的字節(jié)碼指令,都有特殊字符表明該指令服務(wù)哪個數(shù)據(jù)類型: 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類型的數(shù)據(jù)帶符號擴展(sign-extend)為相應的int類型數(shù)據(jù),將boolean和char類型數(shù)據(jù)零位擴展(zero-extend)為相應的int數(shù)據(jù)
c 在處理boolean、byte、short和char類型的數(shù)組時,也會轉(zhuǎn)為使用對應的int類型字節(jié)碼
d JVM指令所支持的數(shù)據(jù)類型表
3、加載和存儲指令
a將一個本地變量加載到操作數(shù)棧的指令包括:iload, iload_, lload, lload_, fload, fload_, dload, dload_, aload, aload_
b將一個數(shù)值從操作數(shù)棧存儲到局部變量表的指令包括:istore, istore_, lstore, lstore_, fstore, fstore_, dstore, dstore_, astore, astore_.
c將一個常量加載到操作數(shù)棧的指令包括:bipush, sipush, ldc, ldc_w, ldc2_w, aconst_null, iconst_m1, iconst_, lconst_, fconst_, dconst_.
d將一用于擴充局部變量表的訪問索引或立即數(shù)的指令:wide
Gainaccesstomorelocalvariablesusingawiderindex,ortoalargerimmediate operand: wide.
e補充說明,非負整數(shù),int,long,float,double
4算數(shù)指令
4.1概述
a JVM沒有明確規(guī)定整型數(shù)據(jù)一出情況,但在整數(shù)除法指令以及整數(shù)求余指令在除數(shù)為0時會拋出ArithmeticException
b JVM要求完全支持IEEE754定義的非標準浮點數(shù)值和逐級下溢(gradual underflow)
c對long進行比較,采用帶符號方式比較。對浮點類型數(shù)進行比較,采用IEEE754標準所定義的無信號比較方式(nonsignaling comparisons)
d把浮點型轉(zhuǎn)為整形數(shù)時,采用IEEE754標準的向零舍入模式(round towards zero mode)
e JVM在處理浮點數(shù)運算時,不會拋出任何JAVA異常。當一個操作向上溢出時,使用有符號的無窮大表示,當向下溢出時,產(chǎn)生非標準值或帶符號的0值。如果操作結(jié)果沒有明確數(shù)學定義,則用NaN值表示
f 各種類型的比較最終都會轉(zhuǎn)化為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類型轉(zhuǎn)換指令
5.1數(shù)值寬化轉(zhuǎn)換( widening numeric conversions,小范圍類型到大范圍類型的安全轉(zhuǎn)換)
a轉(zhuǎn)換類型:
a.1 int to long, float, or double
a.2 long to float or double
a.3 float to double
b寬化轉(zhuǎn)換指令:i2l, i2f, i2d, l2f, l2d, and f2d
c 從float到double轉(zhuǎn)換,在FP-strict模式下可以保證精確相等,否則不能保證。int到long、int到double能保證精確相等。
d從int或long到float、long到double時,可能會發(fā)生精度丟失
e寬化轉(zhuǎn)換雖然可能發(fā)生精度丟失,但不會導致JVM拋出異常
f從int到long轉(zhuǎn)換,是一個簡單的帶符號擴展操作,即把int數(shù)值的二進制補碼表示擴充至更寬的格式
g從char到一個整形轉(zhuǎn)換時一個零位擴展,即直接給char的二進制形式上填若干0,以填充成更寬的格式
h JVM直接支持轉(zhuǎn)換,不需要顯示轉(zhuǎn)換命令
5.2數(shù)值窄化轉(zhuǎn)換(narrowing numeric conversions)
a類型轉(zhuǎn)換
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窄化轉(zhuǎn)換指令:i2b, i2c, i2s, l2i, f2i, f2l, d2i, d2l, and d2f
c因為窄化轉(zhuǎn)換可能會導致轉(zhuǎn)換結(jié)果具備不同的正負號、不同的數(shù)量級,因此會導致數(shù)值丟失精度
d從int或者long窄化轉(zhuǎn)換為整形T,轉(zhuǎn)過過程僅僅是簡單丟低除最低N個二進制以外的內(nèi)容,這可能導致與原始值有不同符號
e將浮點類型窄化轉(zhuǎn)換為整數(shù)T(int或long)時:
e.1如果原始浮點值時NaN,則轉(zhuǎn)換結(jié)果都為0
e.2如果轉(zhuǎn)換結(jié)果v在T范圍內(nèi),則轉(zhuǎn)換結(jié)果值就為v
e.3如果轉(zhuǎn)換結(jié)果v超過T的范圍,則轉(zhuǎn)換結(jié)果值為T最大值
e.4如果轉(zhuǎn)換結(jié)果v低于T的范圍,則轉(zhuǎn)換結(jié)果值為T最小值
f從double轉(zhuǎn)為float的窄化轉(zhuǎn)換過程與IEEE754中定義一致:
f.1、通過向最近數(shù)舍入模式 舍入得到一個可以使用的float類型表示值
f.2、如果轉(zhuǎn)換結(jié)果太小,無法用float表示,則返回float類型的正負0;
f.3、如果轉(zhuǎn)換結(jié)果太大,則返回float類型的無窮大
f.4 、double的NaN值將轉(zhuǎn)為float的NaN值
g、JVM盡管可能發(fā)生上下限溢出或精度丟失等情況,但窄轉(zhuǎn)化永遠不會拋出運行時JAVA異常
6對象創(chuàng)建與訪問指令
a 創(chuàng)建類實例: new.
b 創(chuàng)建數(shù)組: newarray, anewarray, multianewarray.
c 訪問類字段和類實例字段: getstatic, putstatic, getfield, putfield.
d 把一個數(shù)組元素加載到操作數(shù)棧:baload,caload,saload,iaload, laload, faload, daload, aaload.
e 講一個操作數(shù)棧的值存儲到數(shù)組元素中: bastore, castore, sastore, iastore, lastore, fastore, dastore, aastore.
f 取數(shù)組長度: arraylength.
g 檢查類實例或數(shù)組類型: instanceof, checkcast.
7操作數(shù)棧管理指令
直接控制操作數(shù)棧:pop, pop2, dup, dup2, dup_x1, dup2_x1, dup_x2, dup2_x2, swap.
8控制轉(zhuǎn)移指令
a 控制轉(zhuǎn)移指令可以讓JVM從指定指令而不是控制轉(zhuǎn)移指令的下一條指令繼續(xù)執(zhí)行程序(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類型的條件分支轉(zhuǎn)移指令進行的都是有符號的比較操作(All int conditional control transfer instructions perform signed comparisons)
9方法調(diào)用和返回指令
9.1方法調(diào)用指令
a 指令invokevirtual用于調(diào)用對象的實例方法,根據(jù)對象的實際類型進行分派(虛方法分派)
b 指令invokeinterface用于調(diào)用接口方法,會在運行時搜索指定對象所實現(xiàn)的這個接口方法,并找出合適的方法進行調(diào)用
c 指令invokespecial 用于調(diào)用一些需要特殊處理的實例方法,包括實例初始化方法、私有方法、父類方法
d 指令invokestatic調(diào)用命名類中的類方法
e 指令invokedynamic用于調(diào)用以綁定了invokedynamic指令的調(diào)用點對象作為目標的方法(invokes the method which is the target of the call site object bound to the invokedynamic instruction)。每條invokedynamic都有獨一無二的連接狀態(tài)(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指令實現(xiàn)
b JVM中處理異常,近代JVM都是用異常表實現(xiàn),很久之前用jsr和ret指令實現(xiàn)
11同步指令
a JVM支持方法級的同步和方法內(nèi)部的一條短指令序列的同步,都是用同步鎖實現(xiàn)(monitor,管程,更常見被直接稱為鎖)支持。
b方法級的同步時隱式的,從方法的常量池中的方法表結(jié)構(gòu)中的ACC_SYNCHRONIZED區(qū)分是否同步方法
c同步方法執(zhí)行期間拋出異常,且方法內(nèi)部無法處理時,方法所持有的鎖在異常拋到同步方法邊界之外時自動釋放
d指令monitorenter 和monitorexit 用來支持指令序列的同步(synchronized代碼塊)
總結(jié)
以上是生活随笔為你收集整理的java虚拟机所支持的指令_JVM虚拟机指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java 时间l_java中获取系统时间
 - 下一篇: java注解式开发_JAVA语言之Spr