JVM(四):深入分析Java字节码-下

在上文中,我们讲解了 Class 文件中的文件标识,常量池等内容。在本文中,我们就详细说一下剩下的指令集内容,阐述其分别代表了什么含义,以及 JVM 团队这样设计的意义。

简介

JVM 指令设计为仅有一个字节长度,由操作码和紧随其后的零至多个操作数来构成。

这里说到 JVM 的指令仅有一个字节,这意味着 JVM 在操作超过一个字节长度的数据时,需要在运行时重建出多字节数据类型的具体数据结构,例如 Long 等。这会导致这个操作不是原子操作,在高并发的情况下,就有可能会导致错误。

由于 JVM 的操作码长度只有一个字节,因此设计指令的时候,需要考虑所有指令加起来不能超过一个字节长度,正因如此,有许多数据类型是没有其对应的操作码的,其操作的方式是将其数据类型进行向上转型为其他的数据类型来参与运算。

例如大多数对于 boolean、byte、short 和 char 类型数据的操作,实际上是将其转换成 int 类型来处理的。

指令详解

JVM 指令如果详细来说的话有一百多个,在这里全部展开来描述的,不免有流水账的嫌疑,且价值不大,因此在本文中仅粗略描述一下,并找了一些关键的指令对其进行详细拆解,如果读者对其他指令有兴趣的话可以自行 Google 或翻书学习。

全部指令的内容

  • 加载和存储指令:用于将数据在栈帧中的局部变量表和操作数栈之间转移(栈帧的布局放在以后的文章 JVM-内存布局中进行介绍,在这里读者只要明白其是根据栈进行操作就可以了)。eg:load,store;

  • 运算指令:对两个操作数栈上的值进行计算并重新存入到操作栈顶。eg:add,sub,mul,div,rem,neg,shr,or,and,inc……;

  • 类型转换指令:将一个值数据类型进行转换为其他的类型。eg:x2x;

  • 对象创建与访问指令:new,newarray(数组和类实例创建和操作是不同的);

  • 操作数栈操作指令:直接操作操作数栈。eg:pop,swap;

  • 控制转移指令:有条件或无条件的控制 JVM 从指定的位置执行程序。(可以简单理解为修改程序计数器中的值)。eg:if,goto……;

  • 方法调用和返回指令:根据对象的实际类型进行虚方法分配,调用类方法,调用接口方法等。另外还有根据不同的返回类型的不同返回指令;

  • 异常处理指令:目前异常处理在 JVM 内部是通过异常表来完成的;

    Exception table:
    from to target type
    0 8 14 Class java/lang/RuntimeException
    0 8 29 any
    14 23 29 any

from 行 到 to 行之间的字节码指令如果出现了 type 以及其子类的类型错误,就跳转到 target 行对应的字节码指令进行执行;

  • 同步指令:同步指令是通过管程(Monitor)来实现的。

    • 同步方法内部分为方法级的同步和方法内部一段指令的同步。
    • 方法内部的指令,其实现逻辑是设置方法的访问标志:ACC_SYNCHRONIZED,如果其被设置了,表明该同步方法已经被别人调用,其他对象无法获得管程,就需要等待,在获得管程后才能继续执行。
    • 指令内部的同步,其实现逻辑是通过字节码指令来控制的,字节码执行到需要同步的指令时,其会调用monitorenter 指令进行同步,此时其他线程无法进入这段指令序列,当程序正常或异常退出后,调用monitorexit 指令进行锁释放,此时其他线程就可以执行同步方法了。

PS:上面这段是 synchronized 关键字的本质含义,其具体的细节放到高并发编程系列文章中详细来说。

总结

通过 Class 文件这个中间文件,JVM 达成了语言无关性和平台无关性两个大突破,使得 Java 语言不仅达到了“一次编写,处处运行”,也使得其他语言只要符合 JVM 规范,就可以像 Java 一样,达到超然物外的无关性。

文章在公众号 “iceWang" 第一手更新,有兴趣的朋友可以关注公众号,第一时间看到笔者分享的各项知识点,谢谢!笔芯!

本系列文章主要借鉴自《深入分析 JavaWeb 技术内幕》和《深入理解 Java 虚拟机- JVM 高级特性与最佳实践》。

JVM(四):深入分析Java字节码-下的更多相关文章

  1. JVM(三):深入分析Java字节码-上

    JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...

  2. JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  3. JVM 字节码指令手册 - 查看 Java 字节码

    JVM 字节码指令手册 - 查看 Java 字节码 jdk 进行的编译生成的 .class 是 16 进制数据文件,不利于学习分析.通过下命令 javap -c Demo.class > Dem ...

  4. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  5. 深入了解java虚拟机(JVM) 第十章 字节码指令

    一.字节码指令的含义 Java字节码指令由一个字节长度的,代表某种特定操作含义的数字(操作码)以及其后的零至多个代表此操作所需参数(操作数).此外字节码指令是面向操作数栈的,这里操作数栈在功能上对应实 ...

  6. 【JVM源码解析】模板解释器解释执行Java字节码指令(上)

    本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...

  7. JVM Java字节码的角度分析switch的实现

    目录 Java字节码的角度分析switch的实现 引子 前置知识 一个妥协而又枯燥的方案 switch的实现 回顾历史 字节码分析 其他实现方式? Java字节码的角度分析switch的实现 作者 k ...

  8. JAVA字节码解析

    Java字节码指令 Java 字节码指令及javap 使用说明 ### java字节码指令列表 字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送 ...

  9. Java字节码操纵框架ASM小试

    本文主要内容: ASM是什么 JVM指令 Java字节码文件 ASM编程模型 ASM示例 参考资料汇总 JVM详细指令 ASM是什么 ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既 ...

随机推荐

  1. 全志R58平台调通s5k5eya(RAW+MIPI)

    全志R58平台调通s5k5eya(RAW+MIPI) 2017/5/31 10:30 版本:V1.1 1.前期使用的是s5k5eyx的ISP的固件/tuning 文件 Y:\s5k5eya_r58_d ...

  2. 461在全志r16平台tinav3.0系统下使用地磁计QMC5883L

    461在全志r16平台tinav3.0系统下使用地磁计QMC5883L 2018/9/7 14:08 版本:V1.0 开发板:SC3817R SDK:tina v3.0 (基本确认全志tina v3. ...

  3. Android Studio 导入新工程项目

    1 导入之前先修改工程下相关文件 1.1 只需修改如下三个地方1.2 修改build.gradle文件 1.3 修改gradle/wrapper/gradle-wrapper.properties 1 ...

  4. DeltaFish 选题报告总结

    选题结果:校园物资流动系统 报告地点:3A101 会议时间:16:00 ~ 18:00 与会人员:软工小组全体成员 请假人员:无  缺席人员:无 报告人:陈志锴 一.报告内容总结 1.产品功能 针对校 ...

  5. 如何安装sql server2005 windows 8

    如何安装sql server2005   windows 8 1 从网上下载到本地文件 ,这里使用的是cs_sql_2005_dev_all_dvd 安装版. 2. 点击下图所表示进行安装   3. ...

  6. Farseer.net轻量级ORM开源框架 V1.5版本升级消息

    SHA-1: 0ede88104f269f108b68be1e87ffcead4a354ec6 * 提交V1.5版本1.新增:整表缓存的实现方式(提取接口,可由客户端算定义实现)2.新增:SQL配置化 ...

  7. 8086汇编——Introduction(8086内部寄存器,段寄存器,存储器分段)

    8086汇编--Introduction 一.8086CPU的三种工作模式 实模式:只有低20位地址线起作用,仅能寻址第一个1MB的内存空间.MS DOS运行于该模式下. 保护模式:在该模式下,机器可 ...

  8. android手机web网站拨打电话几种方式

    1. <input name="phone" format="*m" value="13"/> <do type=&quo ...

  9. 【Linux】CentOS tar压缩与解压命令大全

    tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...

  10. python练习1 登录和三级菜单

    ,: username1 = input("请输入您的用户名:")# password1 = getpass.getpass("请输入您的密码:") passw ...