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. 安卓P2P开源项目

    https://github.com/LinYaoTian/P2PChat 一个基于局域网的 Android P2P 聊天系统 https://github.com/ddssingsong/webrt ...

  2. keras Model 1 入门篇

    1 入门 2 多个输入和输出 3 共享层 最近在学习keras,它有一些实现好的特征提取的模型:resNet.vgg.而且是带权重的.用来做特诊提取比较方便 首先要知道keras有两种定义模型的方式: ...

  3. leetcode 127. Word Ladder、126. Word Ladder II

    127. Word Ladder 这道题使用bfs来解决,每次将满足要求的变换单词加入队列中. wordSet用来记录当前词典中的单词,做一个单词变换生成一个新单词,都需要判断这个单词是否在词典中,不 ...

  4. Ionic4.x 项目结构简单分析

    新建项目 e2e:端对端测试文件 node_modules :项目所需要的依赖包 resources :android/ios 资源(更换图标和启动动画) src:开发工作目录,页面.样式.脚本和图片 ...

  5. ISO/IEC 9899:2011 条款6.2.5——类型

    6.2.5 类型 1.存储在一个对象中的值或由一个函数所返回的值的意义由用于访问该对象的表达式的类型来确定.(声明为一个对象的一个标识符是最简单的这种表达式:其类型在标识符的声明中指定.)类型被划分为 ...

  6. 41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播

    加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录 AddressAdd.dart import 'package:dio/dio.dart'; import 'pac ...

  7. python根据数组数据绘图

    转载自网络,版权归原作者所有 hello3.txt文件内部数据如下 ......7,2,6,-12,-10,-7,-1,2,9,...... python脚本 import numpy as np i ...

  8. mysql逻辑备份mydumper

      mydumper是一个针对MySQL的高性能多线程备份和恢复工具,它提供了并发备份功能,备份效率有很大提高. 安装mydumper yum安装 # rpm -ivh https://github. ...

  9. svn如何撤销之前某个版本所做的改变

    撤销这个版本所做的修改:(撤销这个版本所做的修改) 右键项目svn->show log->revert changes from this revision 如果要恢复到某个版本:(这个版 ...

  10. Windows 10在2018四月更新中默认安装了OpenSSH客户端

    客户端安装路径 C:\Windows\System32\OpenSSH 版本: