java 深入之 JVM 指令手册

本贴最后更新于 1771 天前,其中的信息可能已经时过境迁

载 float 类型值
fload_2 从局部变量 2 中装载 float 类型值
fload_3 从局部变量 3 中装载 float 类型值
dload_0 从局部变量 0 中装载 double 类型值
dload_1 从局部变量 1 中装载 double 类型值
dload_2 从局部变量 2 中装载 double 类型值
dload_3 从局部变量 3 中装载 double 类型值
aload_0 从局部变量 0 中装载引用类型值
aload_1 从局部变量 1 中装载引用类型值
aload_2 从局部变量 2 中装载引用类型值
aload_3 从局部变量 3 中装载引用类型值
iaload 从数组中装载 int 类型值
laload 从数组中装载 long 类型值
faload 从数组中装载 float 类型值
daload 从数组中装载 double 类型值
aaload 从数组中装载引用类型值
baload 从数组中装载 byte 类型或 boolean 类型值
caload 从数组中装载 char 类型值
saload 从数组中装载 short 类型值
将栈中的值存入局部变量的指令
istore 将 int 类型值存入局部变量
lstore 将 long 类型值存入局部变量
fstore 将 float 类型值存入局部变量
dstore 将 double 类型值存入局部变量
astore 将将引用类型或 returnAddress 类型值存入局部变量
istore_0 将 int 类型值存入局部变量 0
istore_1 将 int 类型值存入局部变量 1
istore_2 将 int 类型值存入局部变量 2
istore_3 将 int 类型值存入局部变量 3
lstore_0 将 long 类型值存入局部变量 0
lstore_1 将 long 类型值存入局部变量 1
lstore_2 将 long 类型值存入局部变量 2
lstore_3 将 long 类型值存入局部变量 3
fstore_0 将 float 类型值存入局部变量 0
fstore_1 将 float 类型值存入局部变量 1
fstore_2 将 float 类型值存入局部变量 2
fstore_3 将 float 类型值存入局部变量 3
dstore_0 将 double 类型值存入局部变量 0
dstore_1 将 double 类型值存入局部变量 1
dstore_2 将 double 类型值存入局部变量 2
dstore_3 将 double 类型值存入局部变量 3
astore_0 将引用类型或 returnAddress 类型值存入局部变量 0
astore_1 将引用类型或 returnAddress 类型值存入局部变量 1
astore_2 将引用类型或 returnAddress 类型值存入局部变量 2
astore_3 将引用类型或 returnAddress 类型值存入局部变量 3
iastore 将 int 类型值存入数组中
lastore 将 long 类型值存入数组中
fastore 将 float 类型值存入数组中
dastore 将 double 类型值存入数组中
aastore 将引用类型值存入数组中
bastore 将 byte 类型或者 boolean 类型值存入数组中
castore 将 char 类型值存入数组中
sastore 将 short 类型值存入数组中
wide 指令
wide 使用附加字节扩展局部变量索引
通用(无类型)栈操作
nop 不做任何操作
pop 弹出栈顶端一个字长的内容
pop2 弹出栈顶端两个字长的内容
dup 复制栈顶部一个字长内容
dup_x1 复制栈顶部一个字长的内容,然后将复制内容及原来弹出的两个字长的内容压入栈
dup_x2 复制栈顶部一个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈
dup2 复制栈顶部两个字长内容
dup2_x1 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈
dup2_x2 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的四个字长的内容压入栈
swap 交换栈顶部两个字长内容
类型转换
i2l 把 int 类型的数据转化为 long 类型
i2f 把 int 类型的数据转化为 float 类型
i2d 把 int 类型的数据转化为 double 类型
l2i 把 long 类型的数据转化为 int 类型
l2f 把 long 类型的数据转化为 float 类型
l2d 把 long 类型的数据转化为 double 类型
f2i 把 float 类型的数据转化为 int 类型
f2l 把 float 类型的数据转化为 long 类型
f2d 把 float 类型的数据转化为 double 类型
d2i 把 double 类型的数据转化为 int 类型
d2l 把 double 类型的数据转化为 long 类型
d2f 把 double 类型的数据转化为 float 类型
i2b 把 int 类型的数据转化为 byte 类型
i2c 把 int 类型的数据转化为 char 类型
i2s 把 int 类型的数据转化为 short 类型
整数运算
iadd 执行 int 类型的加法
ladd 执行 long 类型的加法
isub 执行 int 类型的减法
lsub 执行 long 类型的减法
imul 执行 int 类型的乘法
lmul 执行 long 类型的乘法
idiv 执行 int 类型的除法
ldiv 执行 long 类型的除法
irem 计算 int 类型除法的余数
lrem 计算 long 类型除法的余数
ineg 对一个 int 类型值进行取反操作
lneg 对一个 long 类型值进行取反操作
iinc 把一个常量值加到一个 int 类型的局部变量上
逻辑运算
移位操作
ishl 执行 int 类型的向左移位操作
lshl 执行 long 类型的向左移位操作
ishr 执行 int 类型的向右移位操作
lshr 执行 long 类型的向右移位操作
iushr 执行 int 类型的向右逻辑移位操作
lushr 执行 long 类型的向右逻辑移位操作
按位布尔运算
iand 对 int 类型值进行“逻辑与”操作
land 对 long 类型值进行“逻辑与”操作
ior 对 int 类型值进行“逻辑或”操作
lor 对 long 类型值进行“逻辑或”操作
ixor 对 int 类型值进行“逻辑异或”操作
lxor 对 long 类型值进行“逻辑异或”操作
浮点运算
fadd 执行 float 类型的加法
dadd 执行 double 类型的加法
fsub 执行 float 类型的减法
dsub 执行 double 类型的减法
fmul 执行 float 类型的乘法
dmul 执行 double 类型的乘法
fdiv 执行 float 类型的除法
ddiv 执行 double 类型的除法
frem 计算 float 类型除法的余数
drem 计算 double 类型除法的余数
fneg 将一个 float 类型的数值取反
dneg 将一个 double 类型的数值取反
对象和数组
对象操作指令
new 创建一个新对象
checkcast 确定对象为所给定的类型
getfield 从对象中获取字段
putfield 设置对象中字段的值
getstatic 从类中获取静态字段
putstatic 设置类中静态字段的值
instanceof 判断对象是否为给定的类型
数组操作指令
newarray 分配数据成员类型为基本上数据类型的新数组
anewarray 分配数据成员类型为引用类型的新数组
arraylength 获取数组长度
multianewarray 分配新的多维数组
控制流
条件分支指令
ifeq 如果等于 0,则跳转
ifne 如果不等于 0,则跳转
iflt 如果小于 0,则跳转
ifge 如果大于等于 0,则跳转
ifgt 如果大于 0,则跳转
ifle 如果小于等于 0,则跳转
if_icmpcq 如果两个 int 值相等,则跳转
if_icmpne 如果两个 int 类型值不相等,则跳转
if_icmplt 如果一个 int 类型值小于另外一个 int 类型值,则跳转
if_icmpge 如果一个 int 类型值大于或者等于另外一个 int 类型值,则跳转
if_icmpgt 如果一个 int 类型值大于另外一个 int 类型值,则跳转
if_icmple 如果一个 int 类型值小于或者等于另外一个 int 类型值,则跳转
ifnull 如果等于 null,则跳转
ifnonnull 如果不等于 null,则跳转
if_acmpeq 如果两个对象引用相等,则跳转
if_acmpnc 如果两个对象引用不相等,则跳转
比较指令
lcmp 比较 long 类型值
fcmpl 比较 float 类型值(当遇到 NaN 时,返回-1)
fcmpg 比较 float 类型值(当遇到 NaN 时,返回 1)
dcmpl 比较 double 类型值(当遇到 NaN 时,返回-1)
dcmpg 比较 double 类型值(当遇到 NaN 时,返回 1)
无条件转移指令
goto 无条件跳转
goto_w 无条件跳转(宽索引)
表跳转指令
tableswitch 通过索引访问跳转表,并跳转
lookupswitch 通过键值匹配访问跳转表,并执行跳转操作
异常
athrow 抛出异常或错误
finally 子句
jsr 跳转到子例程
jsr_w 跳转到子例程(宽索引)
rct 从子例程返回
方法调用与返回
方法调用指令
invokcvirtual 运行时按照对象的类来调用实例方法
invokespecial 根据编译时类型来调用实例方法
invokestatic 调用类(静态)方法
invokcinterface 调用接口方法
方法返回指令
ireturn 从方法中返回 int 类型的数据
lreturn 从方法中返回 long 类型的数据
freturn 从方法中返回 float 类型的数据
dreturn 从方法中返回 double 类型的数据
areturn 从方法中返回引用类型的数据
return 从方法中返回,返回值为 void
线程同步
montiorenter 进入并获取对象监视器
monitorexit 释放并退出对象监视器
JVM 指令助记符
变量到操作数栈:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_
操作数栈到变量:istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_
常数到操作数栈:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_
加: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,lshr,iushr,lshl,lshr,lushr
按位或:ior,lor
按位与:iand,land
按位异或:ixor,lxor
类型转换:i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换)
i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)
创建类实便:new
创建新数组:newarray,anewarray,multianwarray
访问类的域和类实例域:getfield,putfield,getstatic,putstatic
把数据装载到操作数栈:baload,caload,saload,iaload,laload,faload,daload,aaload
从操作数栈存存储到数组:bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore
获取数组长度:arraylength
检相类实例或数组属性:instanceof,checkcast
操作数栈管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap
有条件转移:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,
if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl
fcmpg,dcmpl,dcmpg
复合条件转移:tableswitch,lookupswitch
无条件转移:goto,goto_w,jsr,jsr_w,ret
调度对象的实便方法:invokevirtual
调用由接口实现的方法:invokeinterface
调用需要特殊处理的实例方法:invokespecial
调用命名类中的静态方法:invokestatic
方法返回:ireturn,lreturn,freturn,dreturn,areturn,return
异常:athrow
finally 关键字的实现使用:jsr,jsr_w,ret

  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
wgl530
重要的不是你从哪里来,而是你到哪里去,找准方向,继续努力。 重庆

推荐标签 标签

  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 705 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 723 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 3 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 31 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    52 引用 • 40 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖 • 1 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 1 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    197 引用 • 547 回帖 • 1 关注
  • CodeMirror
    1 引用 • 2 回帖 • 126 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 6 关注
  • 倾城之链
    23 引用 • 66 回帖 • 138 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    176 引用 • 815 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    77 引用 • 390 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 388 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 12 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 625 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 346 关注