官术网_书友最值得收藏!

2.1 字節碼概述

Java虛擬機的指令由一個字節長度的操作碼(opcode)和緊隨其后的可選的操作數(operand)構成,如下所示。

        <opcode> [<operand1>, <operand2>]

比如將整型常量100壓棧到棧頂的指令是bipush 100,其中bipush是操作碼,100是操作數。字節碼(bytecode)名字的由來是操作碼的長度用一個字節表示。因為操作碼長度只有一個字節長度,這使得編譯后的字節碼文件非常小巧緊湊,但也直接限制整個JVM操作碼指令集的數量最多只能有256個,目前已經使用超過了200個。

大部分字節碼指令是與類型相關的,比如ireturn指令用于返回一個int類型的數據,dreturn指令用于返回一個double類型的數據,freturn指令用于返回一個float類型的數據,這也使得字節碼實際的指令類型遠小于200個。

字節碼使用大端序(Big-Endian)表示,即高位在前,低位在后的方式,比如字節碼getfield 0002,表示的是getfiled 0x00<<8 | 0x02(getfield #2)。

字節碼并不是某種虛擬CPU的機器碼,而是一種介于源碼和機器碼中間的一種抽象表示方法,不過字節碼通過JIT(Just In Time)技術可以被進一步編譯成機器碼。

根據字節碼的不同用途,字節碼指令可以大概分為如下幾類:

? 加載和存儲指令,比如iload將一個整型值從局部變量表加載到操作數棧;

? 控制轉移指令,比如條件分支ifeq;

? 對象操作,比如創建類實例的指令new;

? 方法調用,比如invokevirtual指令用于調用對象的實例方法;

? 運算指令和類型轉換,比如加法指令iadd;

? 線程同步,比如monitorenter和monitorexit這兩條指令用于支持synchronized關鍵字的語義;

? 異常處理,比如athrow顯式拋出異常。

字節碼是運行在JVM上的,為了能弄懂字節碼,需要對JVM的運行原理有所了解。接下來以Java虛擬機棧為切入點講解字節碼在JVM上執行的細節。

主站蜘蛛池模板: 城固县| 郸城县| 泉州市| 松桃| 乌拉特前旗| 上饶县| 辰溪县| 东海县| 尚志市| 崇文区| 门头沟区| 乌鲁木齐市| 海兴县| 玉门市| 墨玉县| 银川市| 永福县| 武穴市| 竹北市| 白玉县| 鞍山市| 工布江达县| 教育| 凯里市| 泰来县| 濉溪县| 昌吉市| 博兴县| 和硕县| 祁门县| 成安县| 巢湖市| 县级市| 乌拉特前旗| 祁连县| 嘉兴市| 宣汉县| 永年县| 如皋市| 洞口县| 手机|