日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字节码指令分类

發(fā)布時(shí)間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字节码指令分类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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é)

以上是生活随笔為你收集整理的字节码指令分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。