字节码指令简介。

﹏ヽ暗。殇╰゛Y 2024-02-18 19:25 113阅读 0赞

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Pocode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。

字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构,由于限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条;又由于Class文件格式放弃了编译后代码的操作数长度对齐,这就意味着虚拟机处理那些超过一个字节数据的时候,不得不在运行时从字节中重建出具体数据的结构,如果要将一个16位长度的无符号整数使用两个无符号字节存储起来(将它们命名为byte1和byte2),那他们的值应该是这样的:

(byte1 << 8) | byte2

这种操作在某种程度上会导致解释执行字节码时损失一些性能。但这样做的优势也非常明显,放弃了操作数长度对齐。就意味着可以省略很多填充和间隔符号;用一个字节来代表操作码,也是为了尽可能获得短小精干的编译代码。这种追求尽可能小数据量、高传输效率的设计是由Java语言设计之初面向网络、智能家电的技术背景所决定的,并一直沿用至今。

如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当作最基本的执行模型来理解,这个执行模型虽然很简单,但依然可以有效地工作:

do {

自动计算PC寄存器的值加1;

根据PC寄存器的指示位置,从字节码流中取出操作码;

if (字节码存在操作数) 从字节码流中取出操作数;

执行操作码所定义的操作;

} while(字节码流长度>0);

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 字节指令

    目录 2.1 入门 2.2 javap 工具 2.3 图解方法执行流程 1)原始 java 代码 2)编译后的字节码文件 3)常量池载入运行时常量池 4)方法字节

    相关 字节指令简介

    Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Pocode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由

    相关 字节指令分类

    1、加载和存储指令 用于将数据在栈帧中的局部变量表和操作数栈之间来回传输 将一个局部变量加载到操作栈:iload、iload\_<n>、lload、lload\_<n

    相关 Java字节指令简介

    本文是《深入理解Java虚拟机》中第六章的读书笔记。 1、概述 在Class文件中,Java方法里的方法体,也就是代表着一个Java源码程序中程序的部分存储在方法表集合的C

    相关 JVM字节指令简介

    引言 众所周知,Java程序是运行在Java虚拟机上的,而这里的“虚拟”是对什么东西进行虚拟呢?答案当然就是对“实体”机进行虚拟啦,虚拟机可以看做是对实体机进行了进一步的封装

    相关 JVM:字节指令

    加载和存储指令 加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输,这类指令包括如下内容。 将一个局部变量加载到操作栈: > iload、ilo