程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java字節碼指令集的應用具體

Java字節碼指令集的應用具體

編輯:關於JAVA

Java字節碼指令集的應用具體。本站提示廣大學習愛好者:(Java字節碼指令集的應用具體)文章只能為提供參考,不一定能成為您想要的結果。以下是Java字節碼指令集的應用具體正文


    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有前提或無前提從指定指令而不是掌握轉移指令的下一條指令持續履行法式。掌握轉移指令包含:
    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的次數多的情形
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved