欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java字節(jié)碼指令集的使用詳細

 更新時間:2013年05月04日 13:17:04   作者:  
本篇文章對Java字節(jié)碼指令集的使用進行了詳細的介紹。需要的朋友參考下
    Java虛擬機指令由一個字節(jié)長度的、代表某種特定含義的操作碼(Opcode)以及其后的零個至多個代表此操作參數(shù)的操作數(shù)構成。虛擬機中許多指令并不包含操作數(shù),只有一個操作碼。若忽略異常,JVM解釋器使用一下為代碼即可有效工作。
復制代碼 代碼如下:

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

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

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

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

數(shù)據(jù)類型與Java虛擬機

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

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

加載和存儲指令

    加載和存儲指令用于將數(shù)據(jù)從棧幀的局部變量表和操作數(shù)棧之間來回傳輸。
    1)將一個局部變量加載到操作數(shù)棧的指令包括:iload,iload_<n>,lload、lload_<n>、float、 fload_<n>、dload、dload_<n>,aload、aload_<n>。
    2)將一個數(shù)值從操作數(shù)棧存儲到局部變量標的指令:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstore_<n>,astore,astore_<n>
    3)將常量加載到操作數(shù)棧的指令: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等,這幾組指令都是帶有一個操作數(shù)的通用指令。

運算指令

    算術指令用于對兩個操作數(shù)棧上的值進行某種特定運算,并把結果重新存入到操作棧頂。
    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虛擬機沒有明確規(guī)定整型數(shù)據(jù)溢出的情況,但規(guī)定了處理整型數(shù)據(jù)時,只有除法和求余指令出現(xiàn)除數(shù)為0時會導致虛擬機拋出異常。

加載和存儲指令

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

    1)將一個局部變量加載到操作數(shù)棧的指令包括:iload,iload_<n>,lload、lload_<n>、float、 fload_<n>、dload、dload_<n>,aload、aload_<n>。
    2)將一個數(shù)值從操作數(shù)棧存儲到局部變量標的指令:istore,istore_<n>,lstore,lstore_<n>,fstore,fstore_<n>,dstore,dstore_<n>,astore,astore_<n>
    3)將常量加載到操作數(shù)棧的指令: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等,這幾組指令都是帶有一個操作數(shù)的通用指令。

運算指令

    算術指令用于對兩個操作數(shù)棧上的值進行某種特定運算,并把結果重新存入到操作棧頂。
    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虛擬機沒有明確規(guī)定整型數(shù)據(jù)溢出的情況,但規(guī)定了處理整型數(shù)據(jù)時,只有除法和求余指令出現(xiàn)除數(shù)為0時會導致虛擬機拋出異常。

類型轉換指令

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

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

對象創(chuàng)建與操作

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

操作數(shù)棧管理指令

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

    讓JVM有條件或無條件從指定指令而不是控制轉移指令的下一條指令繼續(xù)執(zhí)行程序。控制轉移指令包括:
    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條件分支比較操作,由相應類型的比較運算指令,運算指令會返回一個整型值到操作數(shù)棧中,隨后再執(zhí)行int類型的條件比較操作完成整個分支跳轉。各種類型的比較都最終會轉化為int類型的比較操作。

方法調(diào)用和返回指令

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

同步

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

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

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

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

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

    2)任何時刻都不會出現(xiàn)T釋放M的次數(shù)比T持有M的次數(shù)多的情況

相關文章

  • java中并發(fā)Queue種類與各自API特點以及使用場景說明

    java中并發(fā)Queue種類與各自API特點以及使用場景說明

    這篇文章主要介紹了java中并發(fā)Queue種類與各自API特點以及使用場景說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java 基礎之NIO 學習詳解

    Java 基礎之NIO 學習詳解

    這篇文章主要介紹了java基礎之NIO介紹及使用,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • java實現(xiàn)多人聊天系統(tǒng)

    java實現(xiàn)多人聊天系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)多人聊天系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • spring?webflux響應式編程使用詳解

    spring?webflux響應式編程使用詳解

    webflux,即響應式編程,響應式編程是一種用于處理異步數(shù)據(jù)流和事件的編程范式,spring?webflux是spring在5.0版本后提供的一套響應式編程風格的web開發(fā)框架,本文給大家詳細講講spring?webflux響應式編程的使用,需要的朋友可以參考下
    2023-10-10
  • JSP頁面pageEncoding和contentType屬性

    JSP頁面pageEncoding和contentType屬性

    有關于JSP頁面中pageEncoding和contentType屬性。
    2013-04-04
  • java回調(diào)機制實例詳解

    java回調(diào)機制實例詳解

    這篇文章主要介紹了java回調(diào)機制實例詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • Java代碼實現(xiàn)微信頁面滾動防露底(核心代碼)

    Java代碼實現(xiàn)微信頁面滾動防露底(核心代碼)

    這篇文章主要介紹了Java代碼實現(xiàn)微信頁面滾動防露底的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • 教你用JAVA寫文本編輯器(三)

    教你用JAVA寫文本編輯器(三)

    這篇文章主要給大家介紹了關于用JAVA寫文本編輯器的相關資料,本文主要實現(xiàn)的是一個點擊選擇文本格式的窗口,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • spring boot jar部署控制臺日志亂碼的解決

    spring boot jar部署控制臺日志亂碼的解決

    這篇文章主要介紹了spring boot jar部署控制臺日志亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java在Linux下 不能處理圖形的解決辦法 分享

    Java在Linux下 不能處理圖形的解決辦法 分享

    Java在Linux下 不能處理圖形的解決辦法 分享,需要的朋友可以參考一下
    2013-06-06

最新評論