字節(jié)碼指令

描述

本文摘自深入理解Java虛擬機(jī)中關(guān)于字節(jié)碼的介紹,部分指令參考欢嘿,oracle字節(jié)碼指令集衰琐。

數(shù)據(jù)類型:byte、short炼蹦、int羡宙、long、float掐隐、double狗热、char、boolean虑省、reference匿刮。操作碼以首字符為前綴,reference以a為前綴探颈。例如iload熟丸,加載int到棧頂、aload加載reference到棧頂伪节。

加載和存儲(chǔ)指令

加載和存儲(chǔ)指令用于將數(shù)據(jù)在棧幀中的局部變量表和操作數(shù)棧之間來(lái)回傳輸光羞。

  • 將一個(gè)局部變量加載到操作棧:iload、iload_<n>怀大、lload纱兑、lload_<n>、aload化借、aload_<n>
  • 將一個(gè)數(shù)值從操作數(shù)棧存儲(chǔ)到局部變量表:istore萍启、istore_<n>、lstore屏鳍、lstore_<n>、astore局服、astore_<n>
  • 將一個(gè)常量加載到操作數(shù)棧:bipush钓瞭、sipush、aconst_null淫奔、iconst_<i>山涡、ldc
  • 擴(kuò)充局部變量表的訪問(wèn)索引的指令:wide

<n>:如iload_2,指從局部變量表下標(biāo)2處整型元素加載到操作數(shù)棧頂。iload_0和iload語(yǔ)義一致
<i>:如iconst_2鸭丛,指從整型常量池中常量2加載到操作數(shù)棧頂
bipush:將byte整型常量值推入操作數(shù)棧頂
sipush:將short整型常量值推入操作數(shù)棧頂
ldc:將int竞穷、float、String型常量值從常量池中推入至棧頂

運(yùn)算指令

由于Java虛擬機(jī)沒有直接支持byte鳞溉、short瘾带、char、boolean類型的算術(shù)指令熟菲,使用操作int類型指令替代看政。

  • 加法:iadd、ladd
  • 減法:isub抄罕、lsub
  • 乘法:imul允蚣、lmul
  • 除法:idiv、ldiv
  • 求余:irem呆贿、lrem
  • 取反:ineg嚷兔、lneg
  • 局部變量自增:iinc

類型轉(zhuǎn)換指令

小范圍轉(zhuǎn)大范圍無(wú)需顯示轉(zhuǎn)換

  • int到long、float做入、double
  • long到float冒晰、double
  • float到double

大范圍到小范圍需使用指令

  • i2b:將棧頂int型數(shù)值強(qiáng)制轉(zhuǎn)換成byte型數(shù)值并將結(jié)果壓入棧頂
  • f2l:將棧頂float型數(shù)值強(qiáng)制轉(zhuǎn)換成int型數(shù)值并將結(jié)果壓入棧頂
  • d2l:將棧頂double型數(shù)值強(qiáng)制轉(zhuǎn)換成long型數(shù)值并將結(jié)果壓入棧頂

對(duì)象創(chuàng)建與訪問(wèn)指令

  • 創(chuàng)建類實(shí)例:new
  • 創(chuàng)建數(shù)組:newarray
  • 訪問(wèn)類字段(static字段)和實(shí)例字段(非static字段):getfield、putfield母蛛、getstatic翩剪、putstatic
  • 把一個(gè)數(shù)組元素加載到操作數(shù)棧:iaload、aaload彩郊、daload
  • 把一個(gè)操作數(shù)棧的值存儲(chǔ)到數(shù)組元素中:iastore前弯、aastore、daload
  • 取數(shù)組長(zhǎng)度:arraylength

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

  • 將操作數(shù)棧的棧頂一個(gè)或兩個(gè)元素出棧:pop秫逝、pop2
  • 復(fù)制棧頂一個(gè)或兩個(gè)數(shù)值并將復(fù)制值或雙份的復(fù)制值重新壓入棧頂:dup恕出、dup2
  • 將棧頂?shù)膬蓚€(gè)數(shù)值互換:swap

控制轉(zhuǎn)移指令

控制轉(zhuǎn)移指令就是在有條件或無(wú)條件地修改PC寄存器的值

  • 條件分支:ifeq、iflt违帆、浙巫、ifle、ifgt刷后、ifge的畴、ifnull、ifnonnnull
  • 復(fù)合條件分支:tableswitch尝胆、lookupswitch

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

  • invokevirtual:調(diào)用對(duì)象方法
  • invokeinterface:調(diào)用接口方法丧裁,運(yùn)行時(shí)搜索一個(gè)實(shí)現(xiàn)了這個(gè)接口方法的對(duì)象,找出適合的方法進(jìn)行調(diào)用
  • invokespecial:調(diào)用需要特殊處理的方法含衔,如構(gòu)造器煎娇、私有方法二庵、父類方法
  • invokestatic:調(diào)用類方法(static方法)

異常處理指令

采用異常表實(shí)現(xiàn)

  • athrow:將棧頂異常拋出

同步指令

方法級(jí)同步是隱式的,訪問(wèn)標(biāo)志ACC_SYNCHRONIZED缓呛。同步一段代碼是由Java虛擬機(jī)指令集monitorenter和monitorexit來(lái)支持synchronized關(guān)鍵字語(yǔ)義催享。

示例代碼

public class ByteCodeDemo {


    public static void main(String[] args) {

        ByteCodeDemo demo = new ByteCodeDemo();
        demo.sayHello();
    }

    public void sayHello() {

        synchronized (this) {
            System.out.println("hello");
        }
    }

    public synchronized void sayGoodBye() {
        System.out.println("good bye");
    }
}

使用javap -verbose ByteCodeDemo.class解析字節(jié)碼。對(duì)于私有方法不解析

public void sayHello();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
         0: aload_0
         1: dup
         2: astore_1
         3: monitorenter
         4: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
         7: ldc           #6                  // String hello
         9: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        12: aload_1
        13: monitorexit
        14: goto          22
        17: astore_2                          // 存儲(chǔ)異常信息到局部變量表
        18: aload_1
        19: monitorexit
        20: aload_2                           // 加載異常信息
        21: athrow                            // 將棧頂異常拋出
        22: return
      Exception table:
         from    to  target type
             4    14    17   any              // 4-14行指令拋出任何異常就執(zhí)行17行指令
            17    20    17   any              // 17-20行指令拋出任何異常就執(zhí)行17行指令


public synchronized void sayGoodBye();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_SYNCHRONIZED
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #8                  // String good bye
         5: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return

引用

https://segmentfault.com/a/1190000008722128

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哟绊,一起剝皮案震驚了整個(gè)濱河市因妙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匿情,老刑警劉巖兰迫,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異炬称,居然都是意外死亡汁果,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門玲躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)据德,“玉大人,你說(shuō)我怎么就攤上這事跷车〖” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵朽缴,是天一觀的道長(zhǎng)善玫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)密强,這世上最難降的妖魔是什么茅郎? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮或渤,結(jié)果婚禮上系冗,老公的妹妹穿的比我還像新娘。我一直安慰自己薪鹦,他們只是感情好掌敬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著池磁,像睡著了一般奔害。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上地熄,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天舀武,我揣著相機(jī)與錄音,去河邊找鬼离斩。 笑死银舱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的跛梗。 我是一名探鬼主播寻馏,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼核偿!你這毒婦竟也來(lái)了诚欠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漾岳,失蹤者是張志新(化名)和其女友劉穎轰绵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尼荆,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡左腔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捅儒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片液样。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巧还,靈堂內(nèi)的尸體忽然破棺而出鞭莽,到底是詐尸還是另有隱情,我是刑警寧澤麸祷,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布澎怒,位于F島的核電站,受9級(jí)特大地震影響阶牍,放射性物質(zhì)發(fā)生泄漏喷面。R本人自食惡果不足惜幌缝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一旺上、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忿墅,春花似錦融求、人聲如沸咬像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)县昂。三九已至,卻和暖如春陷舅,著一層夾襖步出監(jiān)牢的瞬間倒彰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工莱睁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留待讳,地道東北人芒澜。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像创淡,于是被迫代替她去往敵國(guó)和親痴晦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354