JVM学习笔记——字节码指令

字节码

0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作。另外,通过不同的组合亦产生了各种字符。同样,可以通过不同的组合产生不同的机器指令。在不同的时代,不同的厂商,机器指令组成的集合是不同的。但毕竟CPU是底层基础硬件,指令集通常以扩展兼容的方式向前不断演进。而机器码是离CPU指令集最近的编码,是CPU可以直接解读的指令,因此机器码肯定是与底层硬件系统耦合的。

问题:如果某个程序员因为不同的硬件平台需要编写多套代码,这是十分令人崩溃的。Java的使命就是一次编写、到处执行。在不同的操作系统、不同硬件平台上,均可以不用修改代码即可顺畅地执行。

如何实现JAVA跨平台?

计算机工程领域的任何问题都可以通过增加一个中间层来解决。因此,中间码应运而生,即"字节码"(Bytecode)。Java所有的指令有200个左右,一个字节(8位)可以存储256种不同的指令信息,一个这样的字节称为字节码(Bytecode)。在代码的执行过程中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖;JVM也可以将字节码编译执行,如果是热点代码,会通过JIT动态地编译为机器码,提高执行效率。

字节码指令

为了方便记忆,JVM在字节码上也和汇编语言改进机器语言借助助记符来高效记忆的方法一样,设计了一套操作码助记符,使用特殊单词来标记这些数字。如ICONST_0代表00000011,即十六进制数为0x03等

字节码主要指令如下:

1.加载或存储指令

在某个栈帧中,通过指令操作数据在虚拟机栈帧的局部变量表与操作栈之间来回传输,常见指令如下:

1)将局部变量加载到操作栈中。如ILOAD(将int类型的局部变量压入栈)和ALOAD(将对象引用的局部变量压入栈)等。

2)从操作栈顶存储到局部变量表。如ISTORE、ASTORE等。

3)将常量加载到操作栈顶,这是极为高频使用的指令。如ICONST、BIPUSH、SIPUSH、LDC等。

*  ICONST 加载的是-1~5的数(ICONST与BIPUSH的加载界限)。

*  BIPUSH,即Byte ImmdiatePUSH,记载-128~-127之间的数。

*  SIPUSH,即Short Immediate PUSH,加载-32768~32767

*  LDC,即Load Constant,在-2147483618~2147483647或者字符串时,JVM采用LDC指令压入栈中。

2. 运算指令

对两个操作栈帧上的值进行运算,并把结果写入操作栈顶,如IADD、IMUL等。

3. 类型转换指令

显示转换两种不同的数值类型。如I2L、D2F等。

4.对象创建与访问指令

根据类进行对象的创建、初始化、方法调用相关指令,常见指令如下:

1)创建对象指令。如NEW、NEWARRAY等。

2)访问属性指令。如GETFIELD、PUTFIELD、GETSTATIC等。

3)检查实力类型指令。如INSTANCEOF、CHECKCAST等。

5.操作栈管理指令

JVM提供了直接控制操作栈的指令,常见指令如下:

1)出栈操作。如POP即一个元素,POP2即两个元素。

2)复制栈顶元素并压入栈。如DUP。

6. 方法调用与返回指令

常见指令如下:

1)INVOKEVIRTUAL指令:调用对象的实例化方法。

2)INVOKESPECIAL指令:调用实例初始化方法、私有方法、父类方法等。

3)INVOKESTATIC指令:调用静态类方法。

4)RETURN指令:返回VOID类型。

7.同步指令

JVM使用方法结构中的ACC_SYNCHRONIZED标志同步方法,指令集中有MONITORENTER和MONITOREXIT支持synchronized语义。

参考书籍——《码出高效》 第四章 走进JVM

JVM学习笔记——字节码指令的更多相关文章

  1. 从jvm字节码指令看i=i++和i=++i的区别

    1. 场景的产生 先来看下下面代码展示的两个场景 @Testvoid testIPP() { int i = 0; for (int j = 0; j < 10; j++) { i = i++; ...

  2. JVM学习笔记——类加载和字节码技术篇

    JVM学习笔记--类加载和字节码技术篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的类加载和字节码技术部分 我们会分为以下几部分进行介绍: 类文件结构 字节码指令 编译期处理 类 ...

  3. JVM学习笔记:字节码执行引擎

    JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667  

  4. JVM学习第三天(JVM的执行子系统)之字节码指令

    早上看了Class类文件结构,晚上继续来看字节码指令,毕竟谁也不是一步登天的(说白了还是穷); 字节码指令 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode ...

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

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

  6. [四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式

      前言简介   前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是 ...

  7. JVM总括三-字节码、字节码指令、JIT编译执行

    JVM总括三-字节码.字节码指令.JIT编译执行 目录:JVM总括:目录 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲 ...

  8. jvm理论-字节码指令

    Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成. 基本数据类型 1.除了l ...

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

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

随机推荐

  1. keras损失函数

    keras文档:  http://keras.io/objectives/ mean_squared_error / mse  均方误差,常用的目标函数,公式为((y_pred-y_true)**2) ...

  2. Java并发包线程池之Executors、ExecutorCompletionService工具类

    前言 前面介绍了Java并发包提供的三种线程池,它们用处各不相同,接下来介绍一些工具类,对这三种线程池的使用. Executors Executors是JDK1.5就开始存在是一个线程池工具类,它定义 ...

  3. javascript——语法 && 结构

    原文链接:Understanding Syntax and Code Structure

  4. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_05-Feign远程调用-客户端负载均衡介绍

    2 Feign远程调用 在前后端分离架构中,服务层被拆分成了很多的微服务,服务与服务之间难免发生交互,比如:课程发布需要调用 CMS服务生成课程静态化页面,本节研究微服务远程调用所使用的技术. 下图是 ...

  5. JAVA8 JVM内存结构变了,永久代到元空间

    在文章<JVM之内存结构详解>中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化.作为面试官如果你还不知道,那么面试过程中是不是有些露怯? ...

  6. var和val的区别

    var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量.这种声明变量的方式和java中声明变量的方式一样. val是一个只读变量,这种声明变量的方式相当于java中的final变量.一个 ...

  7. ORM连表操作

    连表操作分为以下三种情景: 一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.OneToOneField(其他 ...

  8. node.js使用superagent实现模拟登陆功能(包含下载验证码功能)

    superagent版本:3.8.3 样例代码: var process = require('process'); var superagent = require('superagent'); v ...

  9. netcore部署

    配置的几种方式: https://www.cnblogs.com/humin/p/10330983.html Linux下配置sdk: https://dotnet.microsoft.com/dow ...

  10. Docker从入门到动手实践

    一些理论知识,我这里就不累赘了 docker 入门资料,参考:https://yeasy.gitbooks.io/docker_practice/content/ Dockerfile常用命令,图片来 ...