字节码指令分类
1、加載和存儲(chǔ)指令
用于將數(shù)據(jù)在棧幀中的局部變量表和操作數(shù)棧之間來回傳輸
-
將一個(gè)局部變量加載到操作棧:iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>
-
將一個(gè)數(shù)值從操作數(shù)棧存儲(chǔ)到局部變量表:istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n>
-
將一個(gè)常量加載到操作數(shù)棧:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d>
-
擴(kuò)充局部變量表的訪問索引的指令:wide
存儲(chǔ)數(shù)據(jù)的操作數(shù)棧和局部變量表主要由加載和存儲(chǔ)指令進(jìn)行操作,除此之外,還有少量指令,如訪問對(duì)象的字段或數(shù)組元素的指令也會(huì)向操作數(shù)棧傳輸數(shù)據(jù)。
?
?
2、算術(shù)指令
用于對(duì)兩個(gè)操作數(shù)棧上的值進(jìn)行某種特定運(yùn)算,并把結(jié)果重新存入到操作棧頂
-
加法指令:iadd、ladd、fadd、dadd
-
減法指令:isub、lsub、fsub、dsub
-
乘法指令:imul、lmul、fmul、dmul
-
除法指令:idiv、ldiv、fdiv、ddiv
-
求余指令:irem、lrem、frem、drem
-
取反指令:ineg、lneg、fneg、dneg
-
位移指令:ishl、ishr、iushr、lshl、lshr、lushr
-
按位或指令:ior、lor
-
按位與指令:iand、land
-
按位異或指令:ixor、lxor
-
局部變量自增指令:iinc
-
比較指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp
?
分為兩種:對(duì)整型數(shù)據(jù)進(jìn)行運(yùn)算的指令與對(duì)浮點(diǎn)型數(shù)據(jù)進(jìn)行運(yùn)算的指令。
不存在直接支持 byte、short、char 和 boolean 類型的算術(shù)指令,這幾種數(shù)據(jù)的運(yùn)算使用操作 int 類型的指令代替。
數(shù)據(jù)運(yùn)算可能會(huì)導(dǎo)致溢出。
只有除法指令(idiv 和 ldiv)以及求余指令(irem 和 lrem)中除數(shù)為零時(shí)會(huì)導(dǎo)致虛擬機(jī)拋出 ArithmeticException 異常,其余任何整型數(shù)運(yùn)算都不應(yīng)該拋出運(yùn)行時(shí)異常。
?
?
3、類型轉(zhuǎn)換指令
將兩種不同的數(shù)值類型相互轉(zhuǎn)換,一般用于顯式類型轉(zhuǎn)換操作
JVM 直接支持以下數(shù)值類型的寬化類型轉(zhuǎn)換(WideningNumeric Conversion):
-
int -> long、float、double
-
long -> float、double
-
float -> double
與之相對(duì)的,處理窄化類型轉(zhuǎn)換(Narrowing Numeric Conversion)就必須顯式地使用轉(zhuǎn)換指令來完成
-
i2b
-
i2c
-
i2s
-
l2i
-
f2i
-
f2l
-
d2i
-
d2l
-
d2f
窄化類型轉(zhuǎn)換可能會(huì)導(dǎo)致轉(zhuǎn)換結(jié)果產(chǎn)生不同的正負(fù)號(hào)、不同的數(shù)量級(jí)、數(shù)值的精度丟失的情況。
?
?
4、對(duì)象創(chuàng)建與訪問指令
雖然類實(shí)例和數(shù)組都是對(duì)象,但 JVM 對(duì)類實(shí)例和數(shù)組的創(chuàng)建與操作使用了不同的字節(jié)碼指令
?
創(chuàng)建
-
創(chuàng)建類實(shí)例的指令:new
-
創(chuàng)建數(shù)組的指令:newarray、anewarray、multianewarray
?
類實(shí)例的字段、數(shù)組元素的訪問
-
訪問類字段(static 字段)和實(shí)例字段(非 static 字段)的指令:getfield、putfield、getstatic、putstatic
-
把一個(gè)數(shù)組元素加載到操作數(shù)棧的指令:baload、caload、saload、iaload、laload、faload、daload、aaload
-
將一個(gè)操作數(shù)棧的值儲(chǔ)存到數(shù)組元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore
-
取數(shù)組長度的指令:arraylength
-
檢查類實(shí)例類型的指令:instanceof、checkcast
?
?
5、操作數(shù)棧管理指令
-
將操作數(shù)棧的棧頂一個(gè)或兩個(gè)元素出棧:pop、pop2
-
復(fù)制棧頂一個(gè)或兩個(gè)數(shù)值并將復(fù)制值或雙份的復(fù)制值重新壓入棧頂:dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2
-
將棧最頂端的兩個(gè)數(shù)值互換:swap
?
?
6、控制轉(zhuǎn)移指令
讓 JVM 有條件或無條件地從指定位置指令的下一條指令繼續(xù)執(zhí)行程序
-
條件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_acmpeq、if_acmpne
-
復(fù)合條件分支:tableswitch、lookupswitch
-
無條件分支:goto、goto_w、jsr、jsr_w、ret
?
?
7、方法調(diào)用和返回指令
-
invokevirtual:用于調(diào)用對(duì)象的實(shí)例方法,根據(jù)對(duì)象的實(shí)際類型進(jìn)行分派
-
invokeinterface:用于調(diào)用接口方法,它會(huì)在運(yùn)行時(shí)搜索一個(gè)實(shí)現(xiàn)了這個(gè)接口方法的對(duì)象,找出適合的方法進(jìn)行調(diào)用
-
invokespecial:用于調(diào)用一些需要特殊處理的實(shí)例方法,包括實(shí)例初始化方法、私有方法和父類方法
-
invokestatic:用于調(diào)用類靜態(tài)方法
-
invokedynamic:用于在運(yùn)行時(shí)動(dòng)態(tài)解析并執(zhí)行調(diào)用點(diǎn)限定符所引用的方法
-
方法返回指令是根據(jù)返回值的類型區(qū)分的,包括 ireturn(返回 boolean、byte、char、short、int)、lreturn、freturn、dreturn、areturn、return(返回 void;類、接口、實(shí)例初始化方法)
?
?
?
8、異常處理指令
-
throw 語句拋出異常由 athrow 指令來實(shí)現(xiàn)
-
運(yùn)行時(shí)異常會(huì)在其他指令檢測(cè)到異常狀況時(shí)自動(dòng)拋出
-
catch 語句早期版本使用 jsr 和 ret 指令來實(shí)現(xiàn),現(xiàn)在采用異常表來完成
?
?
9、同步指令
-
方法級(jí)的同步:ACC_SYNCHRONIZED
-
方法內(nèi)同步:monitorenter、monitorexit
?
?
【Java學(xué)習(xí)資源】整理推薦
- MAT 分析堆內(nèi)存快照
- jclasslib 查看類信息
- 增大 MAT 堆內(nèi)存
- JVM 常用配置參數(shù)(Java 8)
- 40 道JVM面試題解答
- JVM 問題排查常用指令
- jvisualvm 遠(yuǎn)程連接服務(wù)器 JVM
- 字節(jié)碼指令分類
- -verbose:gc 和 -XX:+PrintGC 的區(qū)別
- JVM字節(jié)碼指令表
- 圖解 Class 文件結(jié)構(gòu)
- Class 文件的結(jié)構(gòu)
- JVM 故障處理工具列表
- HotSpot 內(nèi)存分配的主要規(guī)則
- 開啟 GC 日志
- 垃圾收集器及特點(diǎn)
- JVM垃圾回收算法
- 什么樣的 Java 對(duì)象會(huì)被當(dāng)垃圾回收?
- 內(nèi)存溢出復(fù)現(xiàn)
- HotSpot VM 中對(duì)象的內(nèi)存分析
- JVM 控制的內(nèi)存區(qū)域
- JVM家族
- Java 的發(fā)展史
- 常見 JVM dump 指令
?
?
【Java面試題與答案】整理推薦
- 基礎(chǔ)與語法
- 集合
- 網(wǎng)絡(luò)編程
- 并發(fā)編程
- Web
- 安全
- 設(shè)計(jì)模式
- 框架
- 算法與數(shù)據(jù)結(jié)構(gòu)
- 異常
- 文件解析與生成
- Linux
- MySQL
- Oracle
- Redis
- Dubbo
?
總結(jié)
- 上一篇: ArcGIS10从入门到精通系列实验视频
- 下一篇: PMP考试的难度怎么样?