亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java字節碼指令集的使用詳細

2019-11-26 16:08:23
字體:
來源:轉載
供稿:網友
    Java虛擬機指令由一個字節長度的、代表某種特定含義的操作碼(Opcode)以及其后的零個至多個代表此操作參數的操作數構成。虛擬機中許多指令并不包含操作數,只有一個操作碼。若忽略異常,JVM解釋器使用一下為代碼即可有效工作。
復制代碼 代碼如下:

do{
    自動計算PC寄存器以及從PC寄存器的位置取出操作碼
    if(存在操作數) 取出操作數;
    執行操作碼所定義的操作;
}while(處理下一次循環)

操作數的數量以及長度,取決于操作碼,若一個操作數長度超過了一個字節,將會以Big-Endian順序存儲(高位在前字節碼),其值應為(byte1<<8)|byte2。

    字節碼指令流是單字節對齊,只有"tableswitch"和"lookupswitch"兩指令例外,它們的操作數比較特殊,以4字節為界限劃分的,需要預留出相應的空位來實現對齊。

    限制Java虛擬機操作碼的長度為一個字節,且放棄編譯后代碼的參數長度對齊,是為了獲得短小精干的編譯代碼,即使可能會讓JVM實現付出一定性能成本為代價。由于操作碼只能有一個字節長度,故限制了指令集的數量,又沒有假設數據是對齊好的,意味著數據超過一個字節時,不得不從字節中重建出具體的數據結構,會損失一些性能。

數據類型與Java虛擬機

    在JVM中的指令集中,大多數指令包含了其操作對應的數據類型信息。如iload指令從局部變量表中加載int型的數據到操作數棧中,而fload加載的是float類型的數據。

    對于大部分與數據類型相關的字節碼指令,他們的操作碼助記符都有特殊的字符來表明:i代表int類型,l代表long,s代表short,b代表 byte,c代表char,f代表float,d代表double,a代表reference。有一些單獨指令可以在必要的時候用來將一些不不支持的類型轉換為可被支持的類型。

加載和存儲指令

    加載和存儲指令用于將數據從棧幀的局部變量表和操作數棧之間來回傳輸。
    1)將一個局部變量加載到操作數棧的指令包括:iload,iload_<n>,lload、lload_<n>、float、 fload_<n>、dload、dload_<n>,aload、aload_<n>。
    2)將一個數值從操作數棧存儲到局部變量標的指令:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstore_<n>,astore,astore_<n>
    3)將常量加載到操作數棧的指令:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_<i>,lconst_<l>,fconst_<f>,dconst_<d>
    4)局部變量表的訪問索引指令:wide
    一部分以尖括號結尾的指令代表了一組指令,如iload_<i>,代表了iload_0,iload_1等,這幾組指令都是帶有一個操作數的通用指令。

運算指令

    算術指令用于對兩個操作數棧上的值進行某種特定運算,并把結果重新存入到操作棧頂。
    1)加法指令:iadd,ladd,fadd,dadd
    2)減法指令:isub,lsub,fsub,dsub
    3)乘法指令:imul,lmul,fmul,dmul
    4)除法指令:idiv,ldiv,fdiv,ddiv
    5)求余指令:irem,lrem,frem,drem
    6)取反指令:ineg,leng,fneg,dneg
    7)位移指令:ishl,ishr,iushr,lshl,lshr,lushr
    8)按位或指令:ior,lor
    9)按位與指令:iand,land
    10)按位異或指令:ixor,lxor
    11)局部變量自增指令:iinc
    12)比較指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp

    Java虛擬機沒有明確規定整型數據溢出的情況,但規定了處理整型數據時,只有除法和求余指令出現除數為0時會導致虛擬機拋出異常。

加載和存儲指令

    加載和存儲指令用于將數據從哦你哦過棧幀的局部變量表和操作數棧之間來回傳輸。

    1)將一個局部變量加載到操作數棧的指令包括:iload,iload_<n>,lload、lload_<n>、float、 fload_<n>、dload、dload_<n>,aload、aload_<n>。
    2)將一個數值從操作數棧存儲到局部變量標的指令:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstore_<n>,astore,astore_<n>
    3)將常量加載到操作數棧的指令:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_<i>,lconst_<l>,fconst_<f>,dconst_<d>
    4)局部變量表的訪問索引指令:wide
    一部分以尖括號結尾的指令代表了一組指令,如iload_<i>,代表了iload_0,iload_1等,這幾組指令都是帶有一個操作數的通用指令。

運算指令

    算術指令用于對兩個操作數棧上的值進行某種特定運算,并把結果重新存入到操作棧頂。
    1)加法指令:iadd,ladd,fadd,dadd
    2)減法指令:isub,lsub,fsub,dsub
    3)乘法指令:imul,lmul,fmul,dmul
    4)除法指令:idiv,ldiv,fdiv,ddiv
    5)求余指令:irem,lrem,frem,drem
    6)取反指令:ineg,leng,fneg,dneg
    7)位移指令:ishl,ishr,iushr,lshl,lshr,lushr
    8)按位或指令:ior,lor
    9)按位與指令:iand,land
    10)按位異或指令:ixor,lxor
    11)局部變量自增指令:iinc
    12)比較指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp

    Java虛擬機沒有明確規定整型數據溢出的情況,但規定了處理整型數據時,只有除法和求余指令出現除數為0時會導致虛擬機拋出異常。

類型轉換指令

    類型轉換指令將兩種Java虛擬機數值類型相互轉換,這些操作一般用于實現用戶代碼的顯式類型轉換操作。
    JVM支持寬化類型轉換(小范圍類型向大范圍類型轉換):
    1)int類型到long,float,double類型
    2)long類型到float,double類型
    3)float到double類型

    窄花類型轉換指令:i2b,i2c,i2s,l2i,f2i,f2l,d2l和d2f,窄化類型轉換可能會導致轉換結果產生不同的正負號,不同數量級,轉換過程可能會導致數值丟失精度。如int或long類型轉化整數類型T時,轉換過程是僅僅丟棄最低位N個字節意外的內容(N是類型T的數據類型長度)

對象創建與操作

    雖然類實例和數組都是對象,Java虛擬機對類實例和數組的創建與操作使用了不同的字節碼指令。
    1)創建實例的指令:new
    2)創建數組的指令:newarray,anewarray,multianewarray
    3)訪問字段指令:getfield,putfield,getstatic,putstatic
    4)把數組元素加載到操作數棧指令:baload,caload,saload,iaload,laload,faload,daload,aaload
    5)將操作數棧的數值存儲到數組元素中執行:bastore,castore,castore,sastore,iastore,fastore,dastore,aastore
    6)取數組長度指令:arraylength
    7)檢查實例類型指令:instanceof,checkcast

操作數棧管理指令

    直接操作操作數棧的指令:pop,pop2,dup,dup2,dup_x1,dup2_x1,dup_x2,dup2_x2和swap
控制轉移指令

    讓JVM有條件或無條件從指定指令而不是控制轉移指令的下一條指令繼續執行程序??刂妻D移指令包括:
    1)條件分支:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnotnull,if_cmpeq,if_icmpne,if_icmlt,if_icmpgt等

    2)復合條件分支:tableswitch,lookupswitch

    3)無條件分支:goto,goto_w,jsr,jsr_w,ret

    JVM中有專門的指令集處理int和reference類型的條件分支比較操作,為了可以無明顯標示一個實體值是否是null,有專門的指令檢測null 值。boolean類型和byte類型,char類型和short類型的條件分支比較操作,都使用int類型的比較指令完成,而 long,float,double條件分支比較操作,由相應類型的比較運算指令,運算指令會返回一個整型值到操作數棧中,隨后再執行int類型的條件比較操作完成整個分支跳轉。各種類型的比較都最終會轉化為int類型的比較操作。

方法調用和返回指令

    invokevirtual指令:調用對象的實例方法,根據對象的實際類型進行分派(虛擬機分派)。
    invokeinterface指令:調用接口方法,在運行時搜索一個實現這個接口方法的對象,找出合適的方法進行調用。
    invokespecial:調用需要特殊處理的實例方法,包括實例初始化方法,私有方法和父類方法
    invokestatic:調用類方法(static)
    方法返回指令是根據返回值的類型區分的,包括ireturn(返回值是boolean,byte,char,short和 int),lreturn,freturn,drturn和areturn,另外一個return供void方法,實例初始化方法,類和接口的類初始化i 方法使用。

同步

    JVM支持方法級同步和方法內部一段指令序列同步,這兩種都是通過moniter實現的。

    方法級的同步是隱式的,無需通過字節碼指令來控制,它實現在方法調用和返回操作中。虛擬機從方法常量池中的方法標結構中的 ACC_SYNCHRONIZED標志區分是否是同步方法。方法調用時,調用指令會檢查該標志是否被設置,若設置,執行線程持有moniter,然后執行方法,最后完成方法時釋放moniter。

    同步一段指令集序列,通常由synchronized塊標示,JVM指令集中有monitorenter和monitorexit來支持synchronized語義。

    結構化鎖定是指方法調用期間每一個monitor退出都與前面monitor進入相匹配的情形。JVM通過以下兩條規則來保證結結構化鎖成立(T代表一線程,M代表一個monitor):

    1)T在方法執行時持有M的次數必須與T在方法完成時釋放的M次數相等

    2)任何時刻都不會出現T釋放M的次數比T持有M的次數多的情況
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品亚洲视频在线观看| 中文字幕精品网| 91免费看片网站| 97在线视频一区| 中文字幕亚洲第一| 91久久夜色精品国产网站| 国产精品三级网站| 欧美成年人网站| 欧洲精品在线视频| 精品亚洲一区二区三区在线观看| 国模视频一区二区| 国产精品吊钟奶在线| 精品五月天久久| 午夜精品一区二区三区在线视| 国产精品精品一区二区三区午夜版| 欧美日韩精品二区| xxxx欧美18另类的高清| 欧美理论电影在线观看| 91国产精品视频在线| 一区二区三区www| 精品亚洲一区二区三区四区五区| 亚洲精品99999| 久久久久久久久网站| 国产成人精品视频| 日本一区二区不卡| 亚洲国产精品va在线观看黑人| 97视频免费在线看| 97视频国产在线| 青草青草久热精品视频在线网站| 精品国产福利在线| 国产精品网站入口| 亚洲区一区二区| 亚洲开心激情网| 国产日韩在线亚洲字幕中文| 欧美一区深夜视频| 北条麻妃在线一区二区| 久久综合五月天| 欧美大片在线看| 久久在精品线影院精品国产| 日本欧美中文字幕| 亚洲精品一区二区三区婷婷月| 黑人巨大精品欧美一区二区一视频| 国产精品网红福利| 久久久精品国产一区二区| 亚洲社区在线观看| 久久99久国产精品黄毛片入口| 国产精品久久久久久亚洲调教| 欧美电影免费在线观看| 黑人巨大精品欧美一区二区免费| 伊是香蕉大人久久| 91精品国产91久久久久久吃药| 欧美一级片免费在线| 欧美精品在线观看| 中日韩午夜理伦电影免费| 久久精品国产成人精品| 久久不射热爱视频精品| 日韩毛片中文字幕| 日韩精品在线免费| 日本亚洲精品在线观看| 国产精品亚洲第一区| 精品国产欧美一区二区三区成人| 日韩国产高清视频在线| 国产欧美日韩中文| 欧美日韩亚洲天堂| 国产精品久久久久久久久| 日韩性生活视频| 久久成人国产精品| 亚洲一区二区日本| 久久久91精品国产一区不卡| 久久久久成人精品| 国产亚洲成av人片在线观看桃| 91精品久久久久久久久| 91麻豆国产精品| 成人看片人aa| 久久夜色精品亚洲噜噜国产mv| 久久国产色av| 日本欧美爱爱爱| 久久网福利资源网站| 国产va免费精品高清在线观看| 国内精品模特av私拍在线观看| 亚洲欧美中文在线视频| 97精品视频在线| 日韩av网站在线| 午夜免费久久久久| 深夜福利一区二区| 日韩免费观看在线观看| 欧美在线观看日本一区| 国产精品美腿一区在线看| 亚洲最大av网| 中文字幕亚洲综合久久筱田步美| 日韩精品一区二区视频| 91国产一区在线| 日产精品久久久一区二区福利| 欧美在线性爱视频| 欧美激情第1页| 国产啪精品视频| 国产在线日韩在线| 亚洲自拍小视频免费观看| 日本久久中文字幕| 在线视频免费一区二区| 日日骚av一区| 国产亚洲精品美女久久久| 亚洲精品黄网在线观看| 亚洲天堂av电影| 中文字幕欧美日韩va免费视频| 97在线日本国产| 色偷偷88888欧美精品久久久| 日韩经典第一页| 日韩av黄色在线观看| 亚洲精品一区二区在线| 欧美午夜精品在线| 成人h视频在线观看播放| 欧美激情亚洲激情| 精品视频在线播放| 色樱桃影院亚洲精品影院| 一区二区三区四区视频| 国产成人在线一区二区| 欧美特黄级在线| 国产成人精品在线| 国产视频在线观看一区二区| 91社影院在线观看| 裸体女人亚洲精品一区| 国产精品久久久av久久久| 欧美午夜激情视频| 北条麻妃久久精品| 欧美一级淫片videoshd| 欧美成人性生活| 亚洲自拍偷拍在线| 亚洲成人av在线| 亚洲影视九九影院在线观看| 亚洲国内高清视频| 亚洲午夜未满十八勿入免费观看全集| 日av在线播放中文不卡| 欧美激情在线观看视频| 96精品视频在线| 亚洲男人的天堂在线播放| 国产极品精品在线观看| 久久精品在线视频| 久久男人资源视频| 欧美精品一区二区三区国产精品| 97超级碰在线看视频免费在线看| 亚洲影影院av| 欧美成年人在线观看| 91综合免费在线| 欧美成人免费一级人片100| 久久视频免费观看| 国产99视频精品免视看7| 亚洲级视频在线观看免费1级| 久久人人97超碰精品888| 亚洲欧美制服中文字幕| 中文字幕欧美日韩| 丝袜亚洲欧美日韩综合| 亚洲精品久久久久中文字幕二区| 欧美日韩爱爱视频| 国产成人午夜视频网址| 亚洲第一av网| 91精品国产高清自在线| 国产亚洲人成网站在线观看| 国产成人亚洲精品| 亚洲国产成人av在线| 久久国产精品免费视频| 欧美一级免费视频| 日韩小视频在线| 4438全国成人免费|