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. MYSQL5.7 忘记ROOT密码/初始化ROOT密码

    编辑my.cnf允许空密码登录 [root@7Core ~]# vi /etc/my.cnf #在[mysqld]下加入一行 skip-grant-tables=1 重新启动Mysql服务 [root ...

  2. 在阿里云上搭建nginx + ThinkPHP 的实践

    作为一个程序猿,理应用linux系统来作为平时的工作机环境,哎,之前倒是用过一段时间的linux,可惜后来换了本本,后来竟然没有保持,嗷嗷后悔中... 废话不多说,大家用windows的理由都一样,但 ...

  3. spark源码编译,运行example遇到:NoClassDefFoundError: org/spark_project/guava/cache/CacheLoader

    基本环境: win10+idea Scala2.11.8 maven3.5.3 spark2.1.0 问题: 在window10下编译spark2.1.0源码,在idea下运行example,遇到问题 ...

  4. t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数

    t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数 源自:Stairway to T-SQL: Beyond The Basics Level 6: Using the CASE Expre ...

  5. 【译】x86程序员手册34-9.7错误代码

    9.7 Error Code 错误代码 With exceptions that relate to a specific segment, the processor pushes an error ...

  6. createuser - 定义一个新的 PostgreSQL 用户帐户

    SYNOPSIS createuser [ option...] [ username] DESCRIPTION 描述 createuser 创建一个新的 PostgreSQL 用户.只有超级用户(在 ...

  7. HTTP的缺点与HTTPS

    a.通信使用明文不加密,内容可能被窃听 b.不验证通信方身份,可能遭到伪装 c.无法验证报文完整性,可能被篡改 HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护

  8. 1434:【例题2】Best Cow Fences

    1434:[例题2]Best Cow Fences 时间限制: 1000 ms         内存限制: 65536 KB提交数: 263     通过数: 146 [题目描述] 给定一个长度为n的 ...

  9. ActiveX控件获取不到对象属性或者方法的原因分析

    1.找不到调用的DLL或程序: 2.调用控件方法名称,与定义的函数名称不符合: 3.如果是网站网页调用ActiveX,检查控件是否添加安全对象: 4.如果是网站网页调用ActiveX,检查网页是否加入 ...

  10. Spring Boot 打包分离依赖 JAR 和配置文件

    <properties> <java.version>1.8</java.version> <project.build.sourceEncoding> ...